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

2022-08-31 05:36:13

假设我有一个列出表格上对象的页面,我需要放一个表单来过滤表格。过滤器作为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,) { ... }

可能吗?我该怎么做?


答案 1

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

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

答案 2

我将添加一些简短的示例。

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(在Boot中测试)为答案中提到的请求返回以下错误:

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

数据类将仅适用于以下请求参数表单:

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

请注意这一点!


推荐