Frühjahr RestTemplate - Übergeben Sie in Objekt-Parameter in GET
Wie verwende ich das RestTemplate zu übergeben, die ein Objekt als parameter? Zum Beispiel, sagen, dass ich die folgenden services mit Spring Boot:
@RequestMapping(value = "/get1", method = RequestMethod.GET)
public ResponseEntity<String> get1(@RequestParam(value = "parm") String parm) {
String response = "You entered " + parm;
return new ResponseEntity<String>(response, HttpStatus.OK);
}
@RequestMapping(value = "/get2", method = RequestMethod.GET)
public ResponseEntity<String> get2(@RequestParam(value = "parm") MyObj parm) {
String response = "You entered " + parm.getValue();
return new ResponseEntity<String>(response, HttpStatus.OK);
}
Wenn ein client, nennen wollte der erste Dienst, Sie könnte verwenden Sie die folgenden:
//This works fine
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject("http://localhost:8080/get1?parm={parm}", String.class, "Test input 1");
Aber wenn ein Kunde anrufen wollte der zweite Dienst sind, bekommen Sie einen 500-Fehler mit den folgenden:
//This doesn't work
MyObj myObj = new MyObj("Test input 2");
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject("http://localhost:8080/get2?parm={parm}", String.class, myObj);
Den MyObj-Klasse sieht wie folgt aus:
@JsonSerialize
public class MyObj {
private String inputValue;
public MyObj() {
}
public MyObj(String inputValue) {
this.inputValue = inputValue;
}
public String getInputValue() {
return inputValue;
}
public void setInputValue(String inputValue) {
this.inputValue = inputValue;
}
}
Ich gehe davon aus, dass das problem ist, dass die myObj ist nicht immer richtig-setup als parameter. Wie gehe ich über das tun dies?
Vielen Dank im Voraus.
InformationsquelleAutor | 2016-07-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie ein Komplexes Objekt (wie
MyObj
) als@RequestParam
Frühling versuchen zu konvertieren eine Zeichenfolge in das komplexe Objekt. In diesem Fall, weilMyObj
hat nur eine einzigeString
Feld namensinputValue
wird es automatisch verwenden, was Wert, den Sie bieten, um Ihre Abfrage parmeter füllen Sie die Eigenschaft des Objekts.Zum Beispiel, wenn Sie anrufen:
http://localhost:8080/get2?parm=foobar
erhalten Sie eineMyObj
woinputValue
wird"foobar"
.Wenn Sie
RestTemplate
Sie sollten nicht einen Fehler, aber in der Stelle wird es versuchen, zu konvertierennew MyObj("Test input 2")
eine Zeichenfolge, mit dertoString()
Methode und die Antwort wird sein:Dies ist wahrscheinlich nicht das, was Sie wollen. In der Regel Sie nicht wollen, um pass komplexe Objekte wie request-Parameter, die Sie verwenden können
@RequestBody
mitRequestMethod.POST
undrestTemplate.postForEntity()
ordnungsgemäß übergeben Sie IhreMyObj
als JSON.Ändern Sie Ihren controller wie diesem:
Und rufen Sie es mit
RestTemplate
wie diese:Diese ordnungsgemäß übergeben Sie Ihr Objekt als JSON.
Super Antwort! Tatsächlich, viele popele (wenn auch nicht alle 🙂 ) immer Marschall/unmarschal Objekte als JSON. Ich bin immer Fragen, warum nicht die Implementierung einer Schnittstelle in client-und server-Seite? Solange du nicht öffnen Sie Ihren Dienst an der Welt, ich glaube, es perfekt zu machen ...
Das ist, was ich oft bei Projekten, die REST-client auf Verbraucherseite könnte implementieren die gleiche Schnittstelle wie die REST-Dienst auf der anderen Seite.
InformationsquelleAutor g00glen00b
Übergibt man den Wert der einzelnen URI-parameter nach
responseType
. Problem ist, dassRestTemplate
weiß nicht, wie die Zuordnung der Objekt-URI-Parameter. Sie müssen explizit aufgerufen, entsprechendemyObj
- Methode zum abrufen der ist-Wert:Unterschrift des
getForObject
Methode, die Sie aufrufen, ist:public <T> T getForObject(String url, Class<T> responseType, Object... urlVariables) throws ….
wo
urlVariables
ist array von URI variable Werte erweitern Sie die URI mit.InformationsquelleAutor Michal Foksa
ich vermute
diese:
sollte sich ändern, als
String.class
) wird verwendet, um zu beschreiben, die return-type der Antwort. Die Antwort in beiden/get1
und/get2
ist einString
es ist der request-parameter, der sich ändert.InformationsquelleAutor IZI_SL