2010-11-26 4 views
2

Ich habe eine kleine Frage in Bezug auf Spring MVC Datenbindung Fähigkeiten. Ich habe folgende Controller-Klasse:Wie wird ein Endpunkt in Spring konfiguriert, um sowohl Formulardaten als auch den XML-Anfragetext zu akzeptieren?


@Controller 
@RequestMapping("/foo") 
public class FooController() { 

    // … some init stuff // 

@RequestMapping(value = "/{id}/edit.{format}", method = RequestMethod.POST) 
    public ModelAndView editFoo(@RequestBody FooItem foo, @PathVariable("format") String format) { 

     // some code here to edit the FooItem // 
    } 
} 

Ich möchte in der Lage, Formulardaten sowie XML gegen diese Methode zu schreiben. Damit das funktioniert, habe ich zwei Nachrichtenkonverter zu meinem applicationContext.xml hinzugefügt: Der Standard formHttpMessageConverter und ein XStream Marshaller.

Das funktioniert gut, aber ich habe ein Problem, dass, wenn ich @RequestBody verwenden und Formulardaten gegen die URL, der Server antwortet mit einem 415 Fehler. Wenn ich diese Annotation entferne, funktionieren die Formulardaten gut und Spring erstellt das Objekt für mich, aber wenn ich XML dagegen poste, erhalte ich ein leeres Objekt.

Gibt es einen Weg um dies oder muss ich 2 Methoden haben, um beide eingehenden Formate verarbeiten zu können?

Vielen Dank im Voraus!

+0

Wie posten Sie Formulardaten? Sind Sie sicher, dass die Anfrage einen Header "Content-Type: application/x-www-form-urlencoded" hat? – axtavt

+0

Daten werden mit Standard-HTML-Formular, so die Content-Type-Header zeigt "application/x-www-form-urlencoded" – Markus

Antwort

2

Ich denke, dass Sie zwei Methoden benötigen.

FormHttpMessageConverter haben nicht die gleichen Funktionen wie Datenbindung @ModelAttribute bietet, ist es nicht Anforderung an die angegebene Zielklasse binden kann, nur zu MultiValueMap (siehe javadoc).

+0

klingt vernünftig, da der FormHttpMessageConverter kann nur eine MultiValueMap (wie Sie geschrieben haben). – Markus

+0

Diese Lösung funktioniert, erfordert jedoch einen zusätzlichen Endpunkt ('/ foo' für XML und'/foo/bar' für Formulardaten). Ich sehe, wie ein Filter in der Anforderungsstruktur dabei helfen kann, Anforderungen zu trennen und einen einzelnen Endpunkt (z. B. Körper oder nicht Körper) freizulegen, aber ich frage mich, ob es einen einfacheren Ansatz gibt. Und ja, das ist ein alter Post. Arbeiten mit Legacy-Code ~ –

Verwandte Themen