如何在没有 setter 的情况下绑定请求参数?

2022-09-04 22:17:54

我有一个简单的控制器,带有一个GET处理程序,它接受一个对象来绑定请求参数:

@RestController
@RequestMapping("/test")
public class SampleController {

    @GetMapping
    public SomeResponse find(RequestParams params) {
       // some code
    }

}

这是一个简单的 POJO 类:RequestParams

public class RequestParams  {

    private String param1;
    private String param2;

    // constructor, getter, and setters

}

Everthing工作正常,但我想摆脱设置器,使对象不可变地公开使用。在截至 Spring 5.0.2 的处理程序方法文档中,我们读到可能的有效方法参数是:@RequestMapping

命令或表单对象,用于将请求参数绑定到 Bean 属性(通过 setter)或直接绑定到字段

是否可以以某种方式覆盖默认的 Spring Boot 配置,以便使用反射而不是 setter 将请求参数绑定到类属性?

2018 年更新

在Spring文档的更高版本中,引用的语句已被改写,不再包含有关将请求参数直接绑定到字段的信息。


答案 1

除了@jihor建议的 JSON 批注之外,还可以尝试使用自定义 Web 数据绑定程序,将以下代码添加到控制器或控制器建议类,以跨多个控制器跨功能。

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.initDirectFieldAccess();
}

答案 2

Spring Boot库依赖于Jackson(<-<-),因此可以使用其注释来控制json绑定。spring-boot-starter-webspring-boot-starter-jsonjackson libraries

@JsonCreator-带注释的构造函数或静态方法允许在没有显式 setter 的情况下实例化对象:

@JsonCreator
public RequestParams(@JsonProperty("param1") String param1, 
                     @JsonProperty("param2") String param2) {
    this.param1 = param1;
    this.param2 = param2;
}

文档


推荐