2010-03-08 4 views
6

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?

Répondre

5

La raison la plus probable est que le contexte JAXB ne sait pas comment annuler le masquage d'un objet Resource.

Est-ce que Resource a une annotation @XMLRootElement? Si ce n'est pas le cas, Jaxb2Marshaller n'acceptera pas le paramètre et vous obtiendrez l'erreur 415. Ceci est fait par une délégation de Sprng à l'exécution de JAXB, Spring n'a pas vraiment beaucoup de poids en la matière.

modifier: La contrainte réelle des données sur le paramètre @RequestBody se fait dans HandlerMethodInvoker.resolveRequestBody(). Il y a un certain nombre de conditions qui doivent être remplies avant que la correspondance soit faite, y compris la correspondance du type MIME et du type de classe de paramètre, et si elle échoue, il n'y a pas de journalisation, juste le HTTP 415. Regardez la source de cette méthode , et mieux encore, faites un débogage à distance pour voir où la logique échoue pour votre installation.

+0

Merci pour la suggestion, skaffman. Je vérifie et la classe a en effet un tag @XMLRootElement. –

+0

@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

+0

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

Questions connexes