2016-11-30 118 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; 
} 

文檔

相關問題