我有一个带有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工作正常,但我想摆脱设置者使对象不可变为公共使用 . 在documentation for @RequestMapping
处理程序方法到Spring 5.0.2之前,我们读到可能的有效方法参数是:
命令或表单对象将请求参数绑定到bean属性(通过setter)或直接绑定到字段
是否有可能以某种方式覆盖默认的Spring Boot配置,以便使用反射而不是使用setter将请求参数绑定到类属性?
Update 2018
在Spring的文档的更高版本中,引用的语句已被重新描述,并且不再包含有关绑定请求参数的信息直接到字段 .
3 回答
我不认为你需要在spring boot中更改任何配置 . 似乎spring容器尝试使用setter设置值(如果可用),否则它直接使用该字段 . 那么,您可以尝试将RequestParam类中对象的范围更改为public .
我没有使用过这样的东西,但它似乎应该有效 . 让我们知道发生了什么 .
除了@jihor建议的JSON注释之外,您还可以尝试使用自定义Web Data binder,将以下代码添加到控制器或Controller Advice类以跨多个控制器跨越功能 .
Spring Boot库依赖于Jackson(
spring-boot-starter-web
< -spring-boot-starter-json
< -jackson libraries
),因此可以使用其注释来控制json绑定 .@JsonCreator
-annotated构造函数或静态方法允许在没有显式setter的情况下实例化对象:Documentation
https://fasterxml.github.io/jackson-annotations/javadoc/2.8/com/fasterxml/jackson/annotation/JsonCreator.html
https://github.com/FasterXML/jackson-annotations/wiki