2010-03-08 7 views
6

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?

Antwort

5

Der wahrscheinlichste Grund ist, dass der JAXB-Kontext nicht zu einem Resource Objekt entpacken kann.

Hat Resource eine @XMLRootElement Annotation? Wenn nicht, dann akzeptiert Jaxb2Marshaller den Parameter nicht, und Sie erhalten den Fehler 415. Dies geschieht durch Delegieren von Sprng an die JAXB-Laufzeit, Spring hat eigentlich nicht viel zu sagen.

bearbeitet: Der eigentliche Zwang der Daten auf die @RequestBody Parameter in HandlerMethodInvoker.resolveRequestBody() erfolgt. Es gibt eine ganze Reihe von Bedingungen, die erfüllt sein müssen, bevor die Übereinstimmung hergestellt wird, einschließlich des Abgleichs von MIME-Typ und Parameterklassen-Typ, und wenn es fehlschlägt, gibt es keine Protokollierung, nur HTTP 415. Sehen Sie sich die Quelle für diese Methode an und noch besser, führen Sie ein Remote-Debugging durch, um zu sehen, wo die Logik für Ihre Einrichtung fehlschlägt.

+0

Danke für den Vorschlag, Skaffman. Ich überprüfe und die Klasse hat tatsächlich ein @ XMLRootElement-Tag. –

+0

@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

+0

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. –

Verwandte Themen