Spring MVC méthode de manutention json et la forme params
Je veux la gérer les types de contenu application/x-www-form-urlencoded et de l'application/json dans le seul spring mvc méthode.
J'ai une exigence dans le reste du service à accepter l'entrée sous forme de paramètres ou json. Je peux l'obtenir par écrit les deux méthodes. Le formulaire params ou json, la réponse sera toujours json.
@RequestMapping (method = RequestMethod.POST, produces = {"application/json"},
consumes = {"application/x-www-form-urlencoded"})
public @ResponseBody Book createBook(Book book)
throws Exception {
return book;
}
@RequestMapping (method = RequestMethod.POST, produces = {"application/json"},
consumes = {"application/json"})
public @ResponseBody Book createBookJSON(@RequestBody Book book)
throws Exception {
return book;
}
Est-il possible de combiner ces deux méthodes dans un et de le faire fonctionner? Toute aide sera très appréciée.
Modifier
J'ai mis en œuvre la même, mon contrôleurs et de configuration sont donnés ci-dessous, mais quand j'envoie json demande-je obtenir les valeurs null comme réponse.
Lorsque j'envoie le formulaire params il fonctionne très bien. Aidez-moi à trouver le problème.
Méthode de contrôleur
@RequestMapping (method = RequestMethod.POST, produces = {"application/json", "application/xml"}, consumes = {"application/x-www-form-urlencoded", "application/json"})
public @ResponseBody Book createBook(Book book)
throws Exception {
return book;
}
servlet-contexte
<mvc:view-controller path="/" view-name="index"/>
<context:annotation-config />
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="order" value="1" />
<property name="mediaTypes">
<map>
<entry key="xml" value="application/xml" />
<entry key="json" value="application/json" />
</map>
</property>
<property name="defaultViews">
<list>
<!-- JSON View -->
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
<!-- JAXB XML View -->
<bean class="org.springframework.web.servlet.view.xml.MarshallingView">
<constructor-arg>
<ref bean="jaxb2Marshaller" />
</constructor-arg>
</bean>
</list>
</property>
<property name="ignoreAcceptHeader" value="true" />
</bean>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
<property name="order" value="1" />
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" >
<property name="supportedMediaTypes" value="application/json"/>
</bean>
<bean id="marshallingHttpMessageConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
<property name="marshaller" ref="jaxb2Marshaller" />
<property name="unmarshaller" ref="jaxb2Marshaller" />
<property name="supportedMediaTypes" value="application/xml"/>
</bean>
<bean class = "org.springframework.http.converter.FormHttpMessageConverter">
<property name="supportedMediaTypes" value = "application/x-www-form-urlencoded" />
</bean>
<bean class = "org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value = "text/plain;charset=UTF-8" />
</bean>
</list>
</property>
</bean>
<bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller" >
<property name="classesToBeBound">
<list>
<value>com.lt.domain.Book</value>
</list>
</property>
</bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="order" value="2" />
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
OriginalL'auteur Chakravarthi Bharathi | 2012-12-13
Vous devez vous connecter pour publier un commentaire.
consomme prend un tableau de chaînes de tout ce qu'il peut consommer, printemps haricot de liaison doit prendre soin de tout le reste. Le problème est peut-être vous n'avez pas défini de haricot de liaison correctement pour marshall et unmarshall json automatiquement. à l'aide de @RequestBody et @RepsonseBody n'est pas la meilleure option à mon humble avis.
assurez-vous que jackson est ajouté à vos dépendances
et l'utilisation d'un contentnegotiatingviewresolver
assurez-vous de l'accepter en-têtes sont définies dans votre application client pour les valeurs nécessaires.
Vous devez également être en mesure d'éliminer tous les producteurs et consommateurs de données dans le requestmethod annotation
est l'objet que vous recevez null?, vous devez également déposer l' @responsebody annotation.
Je suis la réception de l'objet d'attributs comme null si j'envoie la demande de json. Si j'envoie la demande que forme params, C'est bien. Si je supprime le corps de la réponse de l'annotation, j'obtiens l'erreur 404.
OriginalL'auteur G-Man
Si vous voulez printemps pour convertir de JSON à l'objet de votre automatiquement, vous devrez utiliser
@RequestBody
. Si vous ne l'utilisez pas, les valeurs ne sont pas liés et tous les paramètres sont nuls comme vous l'avez décrit lors de l'envoi en JSON.Si vous utilisez
@RequestBody
: les coulisses de la conversion est effectuée à l'aide de MessageConverters, comme décrit dans le ressort de la documentation: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-ann-requestbodyVous êtes correctement la configuration de la
MappingJacksonHttpMessageConverter
, dont la traduction de l'JSON de votre objet.Ce qui manque, c'est une traduction à partir des données de formulaire à votre objet:
Vous avez un
FormHttpMessageConverter
enregistré, mais selon la documentation, ce n'est pas ce que vous attendez qu'il fasse. Il se traduit par une demande à l'aide de x-www-form-urlencode pour unMultiValueMap<String, String>
et pas de votre objet personnalisé.Ma compréhension est que vous devriez avoir à écrire quelque chose de similaire à la
MappingJacksonHttpMessageConverter
mais seulement capable de gérer des données de formulaire.OriginalL'auteur David