post xml de REPOS du Ressort serveur retourne le Type de support non pris en charge
Je suis en train de créer un simple ressort en fonction service web qui prend en charge un "post" avec du contenu xml.
Au printemps, je définir 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 un jaxb basé sur xml marshaller:
<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é comme suit, où la "Ressource" est une classe générée automatiquement par jaxb:
@RequestMapping(method = POST, value = "/resource")
public Resource createResource(@RequestBody Resource resource) {
//do work
}
Le résultat d'un webservice appel est toujours "HTTP/1.1 415 non pris en charge Type de Média". 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 suis en train de le type de support correct partout possible. Quelqu'un a une idées?
Edit: après plus de débogage, il semble qu'il n'est jamais aussi loin que d'essayer de unmarshal l'objet. Je ne comprends pas très bien la magie noire derrière l'AnnotationMethodHandler sait que quelque chose de type application/xml doit aller à la MarshallingHttpConverter. Quelqu'un peut nous donner un indice sur qui?
OriginalL'auteur Cheryl Simon | 2010-03-08
Vous devez vous connecter pour publier un commentaire.
La raison la plus probable est que le JAXB contexte ne sais pas comment unmarshal à un
Resource
objet.Ne
Resource
ont un@XMLRootElement
annotation? Si non, alorsJaxb2Marshaller
de ne pas accepter le paramètre, et vous obtiendrez le 415 erreur. Ceci est fait par la délégation de Sprng à la JAXB d'exécution, le Printemps n'est pas vraiment grand-chose à dire en la matière.modifier: La contrainte des données sur le
@RequestBody
paramètre est fait dansHandlerMethodInvoker.resolveRequestBody()
. Il existe un certain nombre de conditions qui doivent être remplies avant que le match est fait, notamment, sur l'appariement de type MIME et le paramètre de type de classe, et si elle échoue, il n'y a pas de connexion, juste le HTTP 415. Jetez un oeil à la source de cette méthode, et mieux encore, faire un peu de débogage à distance pour voir où la logique est l'échec pour votre installation.Et
Resource
est dans lecom.company.schema
paquet? Essayez d'écrire un test unitaire qui construit unJaxb2Marshaller
avec votre config, et assurez-vous quesupport(Resource.class)
retournetrue
. Qui a besoin de travailler avant de pouvoir aller plus loin.Pas de dés, j'ai créé un Jaxb2Marshaller objet, définissez la contextPath et le schéma que j'ai dans mon printemps de fichier, et il dit qu'il prend en charge les élèves de ma classe.
Voir édité réponse.
Merci, cela m'a amené à la bonne réponse! Il s'avère qu'elle n'avait rien à voir avec cette configuration, une autre définition de la AnnotationMethodHandler ailleurs dans le serveur était en conflit avec ma définition.
OriginalL'auteur skaffman