2016-08-18 2 views
4

Ich fing an Springfeder zu lernen und ich bin mit Problemen konfrontiert. Ich habe folgenden Code:Spring MVC: Komplexes Objekt als Parameter

@RestController 
public class UserController { 

    @RequestMapping("/") 
    public String getMessageInfo(Message message) { 
     return "Id is " + message.getId() + ", message is " + message.getMessage() + ", parameter good is " + message.isGood(); 
    } 
} 

Klasse Nachricht:

public class Message { 
    private String message; 
    private int id; 
    private boolean good; 

    public Message() {} 

    public Message(int id) {this.id = id;} 

    public Message(String message) {this.message = message;} 

    public Message(boolean good) {this.good = good;} 

    public Message(String message, boolean good, int id) { 
     this.message = message; 
     this.good = good; 
     this.id = id; 
    } 

    public String getMessage() { 
     return message; 
    } 

    public int getId() { 
     return id; 
    } 

    public boolean isGood() { 
     return good; 
    } 
} 

Und wenn ich versuche, so etwas zu tun:

RestTemplate request = new RestTemplate(); 
String info = request.getForObject("http://localhost:8080/?id=4", String.class); 

Wert von id ignoriert. Das gleiche Problem tritt auf, wenn ich eine Anfrage mit einem booleschen good Parameter absende (zum Beispiel localhost:8080/?good=true). Es heißt der Standardkonstruktor anstelle von Message(boolean)/. Aber wenn ich etwas wie localhost:8080/?message=1234 mache, wird es nicht ignoriert. Kannst du mir erklären, was das Problem ist?

Und noch eine Frage: kann ich Instanz der Klasse Message zu auf andere Weise als localhost:8080/?message=1234&good=true&id=145 senden? Wenn ich mehr als 3 Parameter habe? Zum Beispiel, wenn die Klasse Message 100 Parameter hat?

+1

Sie vermissen die Annotation RequestParam oder ModelAttribute, wenn es sich nicht um einen Tippfehler handelt? –

+0

Ich schrieb 'getMessageInfo (@ModelAttribute (" Nachricht ") Nachricht)' aber nichts geändert. – Anna

+1

Spring ruft immer den Standardkonstruktor auf und verwendet für die Parameter die verfügbaren Setter. Wie Sie nicht haben, wird nichts von der Anfrage weitergegeben werden. Die Bindung funktioniert nur mit einer Klasse, die der Java-Spezifikation entspricht. –

Antwort

1

Da Sie versuchen, mit einem komplexen Objekt umzugehen, akzeptieren Sie Ihr Objekt von einer Postanforderung.

@RequestMapping("/",method=RequestMethod.POST) 
public String getMessageInfo(@RequestBody Message message) { 
    return message; 
} 

in dem obigen Code Ich gründe method Attribut POST dann wird es aufgerufen werden, wenn Sie eine POST Anfrage machen, und ich bin mit @RequestBody Message message innerhalb der Methode parameter. die konvertiert und bilden eine Message object aus dem eingehenden request, wenn Sie nicht @requestBody Annotation dann eine Bean injected auf die Methode von Feder anstelle von eine aus der Anfrage bilden.

können Sie diesen Code versuchen, den Antrag zu stellen

final String uri = "http://localhost:8080/"; 

    Message message = new Message(1, "Adam",true); 

    RestTemplate restTemplate = new RestTemplate(); 
    Message result = restTemplate.postForObject(uri, message, Message.class); 

wenn sie ein Anfrage erstellen eine Message object jedes einzelne Feld darin einstellen, sonst wird am Ende Sie Bad request Fehler zu haben.

0

Sie können wie folgt verwenden, gelöst

MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>(); 
    params.add("id", 1); 
    params.add("good", true); 
    params.add("message", 1234); 
    HttpHeaders requestHeaders = new HttpHeaders(); 
    requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA); 
    HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(params, requestHeaders); 


    RestTemplate restTemplate = new RestTemplate(); 
    Message message= restTemplate.postForObject("http://localhost:8080/", requestEntity, Message.class); 
+0

das Problem bleibt gleich, "int" und "boolean" Parameter immer noch mit Standardwerten. – Anna

+0

In ** Nachricht ** ändere int zu Integer und boolean zu Boolean und versuche es. –

1

ich das Problem, wenn smth wie folgt hinzu:

alle Parameter werden nicht ignoriert

@ModelAttribute("message") 
    public Message getMessage(String message, boolean good, int id){ 
    return new Message(message, good, id); 
} 

@RequestMapping("/") 
public String getUserInfo(@ModelAttribute("message") Message message) { 
    return "Id is " + message.getId() + ", message is " + message.getMessage() + ", parameter good is " + message.isGood(); 
} 
.

Verwandte Themen