Spring MVC:复杂对象作为 GET @RequestParam

新手上路,请多包涵

假设我有一个页面列出了表格中的对象,我需要放置一个表格来过滤表格。过滤器作为 Ajax GET 发送到如下 URL:http: //foo.com/system/controller/action?page= 1&prop1=x&prop2=y&prop3=z

而不是在我的控制器上有很多参数,比如:

 @RequestMapping(value = "/action")
public @ResponseBody List<MyObject> myAction(
    @RequestParam(value = "page", required = false) int page,
    @RequestParam(value = "prop1", required = false) String prop1,
    @RequestParam(value = "prop2", required = false) String prop2,
    @RequestParam(value = "prop3", required = false) String prop3) { ... }

假设我有 MyObject 作为:

 public class MyObject {
    private String prop1;
    private String prop2;
    private String prop3;

    //Getters and setters
    ...
}

我想做类似的事情:

 @RequestMapping(value = "/action")
public @ResponseBody List<MyObject> myAction(
    @RequestParam(value = "page", required = false) int page,
    @RequestParam(value = "myObject", required = false) MyObject myObject,) { ... }

可能吗?我怎样才能做到这一点?

原文由 renanleandrof 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 996
2 个回答

你绝对可以这样做,只需删除 @RequestParam 注释,Spring 将干净地将你的请求参数绑定到你的类实例:

 public @ResponseBody List<MyObject> myAction(
    @RequestParam(value = "page", required = false) int page,
    MyObject myObject)

原文由 Biju Kunjummen 发布,翻译遵循 CC BY-SA 3.0 许可协议

我将从我这里添加一些简短的例子。

DTO类:

 public class SearchDTO {
    private Long id[];

    public Long[] getId() {
        return id;
    }

    public void setId(Long[] id) {
        this.id = id;
    }
    // reflection toString from apache commons
    @Override
    public String toString() {
        return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    }
}

控制器类中的请求映射:

 @RequestMapping(value="/handle", method=RequestMethod.GET)
@ResponseBody
public String handleRequest(SearchDTO search) {
    LOG.info("criteria: {}", search);
    return "OK";
}

询问:

 http://localhost:8080/app/handle?id=353,234

结果:

 [http-apr-8080-exec-7] INFO  c.g.g.r.f.w.ExampleController.handleRequest:59 - criteria: SearchDTO[id={353,234}]

我希望它有所帮助 :)

更新/科特林

因为目前我经常使用 Kotlin,如果有人想定义类似的 DTO,那么 Kotlin 中的类应该具有以下形式:

 class SearchDTO {
    var id: Array<Long>? = arrayOf()

    override fun toString(): String {
        // to string implementation
    }
}

使用 data 这样的类:

 data class SearchDTO(var id: Array<Long> = arrayOf())

Spring(在引导中测试)为答案中提到的请求返回以下错误:

“无法将类型 ‘java.lang.String[]’ 的值转换为所需类型 ‘java.lang.Long[]‘;嵌套异常是 java.lang.NumberFormatException:对于输入字符串:\“353,234\””

数据类仅适用于以下请求参数形式:

 http://localhost:8080/handle?id=353&id=234

请注意这一点!

原文由 Przemek Nowak 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题