2010-11-26 33 views
2

J'ai une petite question concernant les capacités de liaison de données MVC de Spring. j'ai la classe suivante:Comment configurer un point de terminaison dans Spring pour accepter à la fois les données de formulaire et le corps de requête XML?


@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 // 
    } 
} 

Je veux être en mesure d'afficher des données de formulaire ainsi que XML par rapport à cette méthode. Pour que cela fonctionne, j'ai ajouté deux convertisseurs de messages à mon applicationContext.xml: Le formHttpMessageConverter par défaut et un marshaller XStream.

Cela fonctionne très bien, mais j'ai un problème, que si j'utilise @RequestBody et publie des données de formulaire contre l'URL, le serveur répond avec une erreur 415. Si je supprime cette annotation, les données de formulaire fonctionnent bien et Spring crée l'objet pour moi, mais si je publie du XML par rapport à celui-ci, j'obtiens un objet vide.

Y at-il un moyen de contourner cela ou dois-je avoir 2 méthodes pour être en mesure de gérer les deux formats entrants?

Merci d'avance!

+0

Comment affichez-vous des données de formulaire? Êtes-vous sûr que cette requête a un en-tête Content-Type: application/x-www-form-urlencoded'? – axtavt

+0

Les données sont affichées avec un formulaire HTML standard. L'en-tête Content-Type affiche "application/x-www-form-urlencoded" – Markus

Répondre

2

Je pense que vous avez besoin de deux méthodes.

FormHttpMessageConverter n'a pas les mêmes capacités de liaison de données que @ModelAttribute fournit, il ne peut pas se lier demande à la classe cible spécifiée, pour MultiValueMap (voir javadoc).

+0

semble raisonnable, car FormHttpMessageConverter ne peut renvoyer qu'un MultiValueMap (comme vous l'avez écrit). – Markus

+0

Cette solution fonctionne, mais nécessite une extrémité supplémentaire ('/ foo' pour XML et'/foo/bar' pour les données de formulaire). Je vois comment un filtre sur la structure de demande pourrait aider à séparer les demandes et à exposer un seul point de terminaison (par exemple, corps ou non), mais je me demande s'il existe une approche plus directe. Et oui, c'est un vieux billet. Travailler sur le code hérité ~ –