2017-04-12 3 views
3

Ich habe eine Spring Rest Endpunkt eine einfache Hallo App. Es sollte einen {"name": "etwas"} akzeptieren und "Hallo, etwas" zurückgeben.Spring Rest JSON Post null Werte

Mein Controller ist:

@RestController 
public class GreetingController { 

    private static final String template = "Hello, %s!"; 

    @RequestMapping(value="/greeting", method=RequestMethod.POST) 
    public String greeting(Person person) { 
     return String.format(template, person.getName()); 
    } 

} 

Person:

public class Person { 

    private String name; 

    public Person() { 
     this.name = "World"; 
    } 

    public Person(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return this.name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

Wenn ich eine Anfrage an den Service machen wie

curl -X POST -d '{"name": "something"}' http://localhost:8081/testapp/greeting 

I

bekommen
Hello, World! 

Sieht so aus, als würde das JSON nicht ordnungsgemäß in das Person-Objekt deserialisiert. Es verwendet den Standardkonstruktor und setzt dann den Namen nicht. Ich habe folgendes gefunden: How to create a POST request in REST to accept a JSON input?, also habe ich versucht, ein @RequestBody auf dem Controller hinzuzufügen, aber das verursacht einen Fehler über "Inhaltstyp" application/x-www-form-urlencoded; charset = UTF-8 'wird nicht unterstützt ". Ich sehe, dass das hier behandelt wird: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported for @RequestBody MultiValueMap, was das Entfernen der @RequestBody

schlägt Ich habe versucht, den Standardkonstruktor zu entfernen, die es auch nicht mag.

Diese Frage deckt Nullwerte REST webservice using Spring MVC returning null while posting JSON aber es schlägt @RequestBody Zugabe aber, dass Konflikte mit oben ...

Antwort

7

Sie müssen die @RequestBody gesetzt zu sagen, zum Frühling, was Nutzen sein sollten Ihre person param einzustellen.

public Greeting greeting(@RequestBody Person person) { 
    return new Greeting(counter.incrementAndGet(), String.format(template, person.getName())); 
} 
+0

Wie gesagt in meiner Beschreibung, die zu einer "Inhaltstyp" -Anwendung führt/x-www-form-urlencoded; Zeichensatz = UTF-8 'nicht unterstützt " – MichaelB

+0

Ihr Inhaltstyp sollte' Inhaltstyp'-Anwendung sein/json' – Zorglube

+0

Sie könnten PostMan verwenden O r einige andere Json-Client, um Ihre App zu testen, könnte ich einfacher sein. – Zorglube

2

Sie setzen müssen 'produziert' mit @RequestMapping (value = "/ Gruß", method = RequestMethod.POST)

Verwendung Code unten

@RequestMapping(value="/greeting", method=RequestMethod.POST, produces = { MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE }) 
public String greeting(Person person) { 
     return String.format(template, person.getName()); 
    } 
+0

"produziert" bezieht sich auf die Antwort. Die Antwort ist in Ordnung. Da es eine einfache Zeichenfolge zurückgibt, sollte es auch MediaType sein. TEXT_PLAIN_VALUE – MichaelB

+0

versuchen Sie 'verbraucht = MediaType.ALL_VALUE' –

+0

@ PranayKumbhalkar, 'konsumiert = MediaType.ALL_VALUE' ist keine Lösung. Wenn Sie eine Prüfung nicht bestehen können, wird die Prüfung durch die Lösung nicht deaktiviert. Die Lösung ändert das, was Sie senden. – Zorglube

Verwandte Themen