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

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

@RestController @RequestMapping("/test") public class SampleController { @GetMapping public SomeResponse find(RequestParams params) { // some code } } 

RequestParams是一个简单的POJO类:

 public class RequestParams { private String param1; private String param2; // constructor, getter, and setters } 

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

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

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

更新2018年

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

除了@jihor建议的JSON注释之外,您还可以尝试使用自定义Web数据绑定器 ,将以下代码添加到控制器或Controller Advice类以跨多个控制器跨越function。

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

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

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

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

文档

我认为您不需要在spring boot中更改任何配置。 似乎spring容器尝试使用setter设置值(如果可用),否则它直接使用该字段。 那么,您可以尝试将RequestParam类中对象的范围更改为public。

 public class RequestParams { public String param1; public String param2; // constructor, getter, and setters } 

我没有使用过这样的东西,但它似乎应该有效。 让我们知道发生了什么。