2016-11-30 100 views
8

我有一个接受一个对象绑定请求参数的GET处理的简单控制器:如何在没有setter的情况下绑定请求参数?

@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 

} 

寄托都工作正常,但我想摆脱setter使对象不可变为公共使用。在documentation@RequestMapping处理方法中,我们读到 可能的有效方法的参数是:

绑定请求参数bean属性 (通过设置器) ,或直接在字段

的命令或表单对象

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

回答

0

我不认为你需要改变春季引导的任何配置。看起来Spring容器试图使用setter来设置值,否则它直接使用该字段。那么,您可以请尝试将RequestParam类中的对象范围更改为public。

public class RequestParams { 

    public String param1; 
    public String param2; 

    // constructor, getter, and setters 

} 

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

+0

不幸的是,如果字段的范围更改为'public'并且setter被删除,则请求参数不会绑定到该对象。即便如此,我的目标是保持对象不变,至少对公众有用,因此将对象公开只会让事情变得更糟。 –

1

春季启动库取决于杰克逊(spring-boot-starter-web < - spring-boot-starter-json < - jackson libraries),所以可以使用它的注释来控制JSON绑定。

@JsonCreator -annotated构造函数或静态方法允许实例化对象没有明确的制定者:

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

文档

相关问题