J'essaie de créer un service Web simple basé sur le printemps qui prend en charge un "post" avec du contenu xml.post xml au serveur Spring REST renvoie le type de support non pris en charge
Au printemps, je définis un AnnotationMethodHandler:
<bean id="inboundMessageAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<util:list>
<bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
<property name="marshaller" ref="xmlMarshaller"/>
<property name="unmarshaller" ref="xmlMarshaller"/>
</bean>
</util:list>
</property>
</bean>
Et basé sur XML JAXB placier:
<bean id="xmlMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="contextPaths">
<array>
<value>com.company.schema</value>
</array>
</property>
<property name="schemas">
<array>
<value>classpath:core.xsd</value>
</array>
</property>
</bean>
Mon contrôleur est annotés comme suit, où "ressources" est une classe autogénérés par JAXB :
@RequestMapping(method = POST, value = "/resource")
public Resource createResource(@RequestBody Resource resource) {
// do work
}
Le résultat d'un appel de service Web est toujours "HTTP/1.1 415 non pris en charge Med ia Type ". Voici un exemple d'appel de service:
HttpPost post = new HttpPost(uri);
post.addHeader("Accept", "application/xml");
post.addHeader("Content-Type", "application/xml");
StringEntity entity = new StringEntity(request, "UTF-8");
entity.setContentType("application/xml");
post.setEntity(entity);
Il me semble que je mets le bon type de support partout où c'est possible. Quelqu'un a une idée? Edit: après un débogage plus poussé, il semble que l'on ne parvienne jamais à démasquer l'objet. Je ne comprends pas vraiment la magie noire derrière la façon dont AnnotationMethodHandler sait que quelque chose de type application/xml devrait aller au MarshallingHttpConverter. Quelqu'un peut-il faire la lumière sur cela?
Merci pour la suggestion, skaffman. Je vérifie et la classe a en effet un tag @XMLRootElement. –
@Mayra: Et 'Resource' est dans le paquet' com.company.schema'? Essayez d'écrire un test unitaire qui construit un 'Jaxb2Marshaller' avec votre config, et assurez-vous que' support (Resource.class) 'retourne' true'. Cela doit fonctionner avant que vous puissiez aller plus loin. – skaffman
Pas de dés, j'ai créé un objet Jaxb2Marshaller, définissez le contextPath et le schéma comme je l'ai dans mon fichier de printemps, et il dit qu'il prend en charge ma classe. –