【问题标题】:Spring MVC @RequestParam a list of objectsSpring MVC @RequestParam 对象列表
【发布时间】:2015-10-26 19:59:46
【问题描述】:

我想创建一个页面,人们可以在其中看到用户列表,并且每个用户旁边都有复选框,用户可以单击以将其删除。

在使用 REST API 的 MVC 中,我想将 User 对象列表发送到 REST API。

@RequestParam 注释可以支持吗?

例如:

@RequestMapping(method = RequestMethod.DELETE, value = "/delete")
    public @ResponseBody Integer delete(
            @RequestParam("users") List<Users> list) {
        Integer deleteCount = 0;
        for (User u : list) {
            if (u != null) {
                repo.delete(u);
                ++deleteCount;
            }
        }
        return deleteCount;
    }

在 MVC 客户端中,url 是:

List list = new ArrayList<User>();
....
String url = "http://restapi/delete?users=" + list;

【问题讨论】:

    标签: spring rest spring-mvc http-post httprequest


    【解决方案1】:

    请求参数是一个字符串到字符串的Multimap。您不能将复杂对象作为请求参数传递。

    但是,如果您只是传递应该可以使用的用户名 - 请参阅 how to capture multiple parameters using @RequestParam using spring mvc?

    @RequestParam("users") List&lt;String&gt; list

    但我认为只使用请求正文来传递信息会更好。

    【讨论】:

    • 啊,是的,@RequestBody 提供了我正在寻找的功能。
    • @RequestBody 不允许用于 Restful API 的 GET。这将导致诸如 springdoc 之类的 openapi 库出现问题
    【解决方案2】:

    Spring mvc 可以支持List&lt;Object&gt;Set&lt;Object&gt;Map&lt;Object&gt; 参数,但不支持@RequestParam。

    List&lt;Object&gt;为例,如果你的对象是User.java,是这样的:

    public class User {
        private String name;
        private int age;
    
        // getter and setter
    }
    

    如果你想传递List&lt;User&gt;的参数,你可以像这样使用url

    http://127.0.0.1:8080/list?users[0].name=Alice&users[0].age=26&users[1].name=Bob&users[1].age=16
    

    记得对url进行编码,编码后的url是这样的:

    http://127.0.0.1:8080/list?users%5B0%5D.name=Alice&users%5B0%5D.age=26&users%5B1%5D.name=Bob&users%5B1%5D.age=16
    

    List&lt;Object&gt;Set&lt;Object&gt;Map&lt;Object&gt; 的示例显示在my github 中。

    【讨论】:

    • 仅供像我一样困惑的任何人使用。使用List&lt;User&gt; 作为控制器的参数将不起作用。相反,应该使用包含列表的包装类作为参数。检查github链接!
    猜你喜欢
    • 2013-06-01
    • 2011-11-12
    • 2017-11-16
    • 2011-02-02
    • 2016-06-30
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多