2016-11-30 6 views
8

Ich habe eine einfache Steuerung mit einem GET-Handler, die ein Objekt akzeptiert Anforderungsparameter zu binden:Wie bind Anfrage Parameter ohne Setter?

@RestController 
@RequestMapping("/test") 
public class SampleController { 

    @GetMapping 
    public SomeResponse find(RequestParams params) { 
     // some code 
    } 

} 

Die RequestParams ist eine einfache POJO Klasse:

public class RequestParams { 

    private String param1; 
    private String param2; 

    // constructor, getter, and setters 

} 

Everthing funktioniert gut, aber ich möchte um die Setter loszuwerden, um das Objekt für den öffentlichen Gebrauch unveränderlich zu machen. Im documentation für @RequestMapping-Handler-Methode lesen wir, dass möglich gültige Methode Argumente sind:

Befehl oder Formularobjekte Anforderungsparameter zu Bean-Eigenschaften (über Setter) oder direkt an Felder

zu binden

Ist es möglich, die Standard-Spring-Boot-Konfiguration irgendwie zu überschreiben, so dass Request-Parameter mit Reflektion und nicht mit Setter an Klasseneigenschaften gebunden sind?

Antwort

0

Ich glaube nicht, dass Sie eine Konfiguration im Spring Boot ändern müssen. Es scheint, dass der Spring-Container versucht, Werte unter Verwendung von Setter zu setzen, falls verfügbar, andernfalls verwendet er das Feld direkt. Können Sie also bitte den Umfang Ihrer Objekte in der RequestParam-Klasse in public ändern?

public class RequestParams { 

    public String param1; 
    public String param2; 

    // constructor, getter, and setters 

} 

Ich habe nicht so etwas verwendet, aber es scheint, dass es funktionieren sollte. Lass uns wissen, was passiert ist.

+0

Wenn der Bereich der Felder in "public" geändert wird und die Setter entfernt werden, sind die Anforderungsparameter leider nicht an das Objekt gebunden. Auch wenn mein Ziel darin besteht, das Objekt zumindest für den öffentlichen Gebrauch unveränderlich zu halten, und die Veröffentlichung von Feldern würde die Dinge nur noch verschlimmern. –

1

Frühlings-Boot-Bibliotheken sind abhängig von Jackson (spring-boot-starter-web <-spring-boot-starter-json <-jackson libraries), so dass man seine Anmerkungen verwenden kann, um json Bindungen zu steuern.

@JsonCreator -annotated Konstrukteuren oder statische Methoden erlauben Objekte ohne explizite Setter zu instanziiert:

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

Dokumentation

Verwandte Themen