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

时间:2016-11-30 19:04:39

标签: java spring spring-mvc spring-boot

我有一个带有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工作正常,但我想摆脱设置者使对象不可变为公共使用。在@RequestMapping for String text = textArea.getText();处理程序方法到Spring 5.0.2之前,我们读到了这一点 可能的有效方法参数是:

  

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

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

更新2018年

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

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

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

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

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

<强>文档

答案 2 :(得分:-1)

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

public class RequestParams  {

    public String param1; 
    public String param2;

    // constructor, getter, and setters

}

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