Ich versuche, eine einfache Feder-basierten Webservice, der eine "Post" mit XML-Inhalt unterstützt.post xml zu Spring REST-Server gibt nicht unterstützten Medientyp
Im Frühjahr definiere ich eine 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>
Und ein jaxb basiert xml Einweiser:
<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>
Mein Controller kommentierte wie folgt, wobei "Ressource" eine Klasse von jaxb automatisch generiert ist :
@RequestMapping(method = POST, value = "/resource")
public Resource createResource(@RequestBody Resource resource) {
// do work
}
Das Ergebnis eines Webservice-Aufrufs ist immer "HTTP/1.1 415 Unsupported Med ia Typ ". Hier ist ein Beispiel-Service-Aufruf:
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);
Es scheint mir, dass ich den richtigen Medientyp überall möglich setze. Hat jemand eine Idee?
Edit: nach weiterem Debugging sieht es so aus, als würde es nie soweit gehen, das Objekt zu entpacken. Ich verstehe die schwarze Magie dahinter nicht, wie der AnnotationMethodHandler weiß, dass etwas vom Typ application/xml zum MarshallingHttpConverter gehen sollte. Kann irgendjemand etwas dazu sagen?
Danke für den Vorschlag, Skaffman. Ich überprüfe und die Klasse hat tatsächlich ein @ XMLRootElement-Tag. –
@Mayra: Und 'Ressource' ist im' com.company.schema' Paket? Versuchen Sie, einen Komponententest zu schreiben, der einen 'Jaxb2Marshaller' mit Ihrer Konfiguration erstellt, und stellen Sie sicher, dass' support (Resource.class) '' true' zurückgibt. Das muss funktionieren, bevor Sie weiterkommen können. – skaffman
Kein Würfel, ich habe ein Jaxb2Marshaller-Objekt erstellt, den ContextPath und das Schema so eingestellt, wie ich es in meiner Spring-Datei habe, und es sagt, dass es meine Klasse unterstützt. –