JAXB + Spring WS : “Pas d'adaptateur pour le point de terminaison” lors de l'utilisation JAXBElement
J'ai un service web que je suis en train de mettre en œuvre à l'aide de Printemps et Jaxb. J'ai déjà une poignée de services à l'aide de ces deux - mais ce service particulier est de me donner un moment difficile en raison du format de la réponse. Dans mon XSD, la réponse est défini comme ceci (notez que c'est un seul élément):
<!-- Response definition -->
<element name="ServiceResponse" type="Q1:Outcome"/>
<!-- Outcome definition -->
<complexType name="Outcome">
<sequence>
<element name="ErrorCode">
<simpleType>
<restriction base="string">
<maxLength value="8"/>
</restriction>
</simpleType>
</element>
<element name="ErrorText">
<simpleType>
<restriction base="string">
<maxLength value="1000"/>
</restriction>
</simpleType>
</element>
<element name="DocumentId">
<simpleType>
<restriction base="string">
<maxLength value="30"/>
</restriction>
</simpleType>
</element>
</sequence>
</complexType>
J'ai une méthode de service qui ressemble à ceci:
@PayloadRoot( localPart = SERVICE_REQUEST, namespace = NAMESPACE )
public Outcome processFileRequest( ServiceRequest requestObject )
Je me retrouve avec une exception qui ressemble à ceci:
java.lang.IllegalStateException:
Aucun adaptateur d'extrémité [public dortman.xsd.objets.Résultat dortman.annoté.MyTestEndpoint.processFileRequest(dortman.xsd.objets.ServiceRequest)]: est-ce que votre point de terminaison de mettre en œuvre une prise en charge de l'interface comme MessageHandler ou PayloadEndpoint?
Après avoir trouvé quelques posts sur le forum du Printemps et de Stackoverflow, il semble que le retour des objets nécessitent de disposer de la XmlRootElement annotation ou d'être enveloppé dans un JAXBElement. Essayer le premier, j'ai changé la réponse dans le fichier XSD:
<!-- Response definition -->
<element name="ServiceResponse">
<complexType>
<sequence>
<element name="FileSize" type="long"/>
</sequence>
</complexType>
</element>
Qui fonctionne, comme JAXB génère alors un ServiceResponse de la classe qui a le XmlRootElement annotation. Malheureusement, je n'ai pas forcément la latitude de la modifier le XSD qui signifie que je dois poursuivre l'autre option. J'ai donc essayé. Ma nouvelle méthode de service ressemble à ceci:
@PayloadRoot( localPart = SERVICE_REQUEST, namespace = NAMESPACE )
public JAXBElement<Outcome> processFileRequest( ServiceRequest requestObject )
Et je puis les envelopper mon retour de l'objet à l'aide de la méthode qui a été créé sur ObjectFactory:
/**
* Create an instance of {@link JAXBElement }{@code <}{@link Outcome }{@code >}}
*
*/
@XmlElementDecl(namespace = "http://www.dortman.com/MyTestService", name = "ServiceResponse")
public JAXBElement<Outcome> createServiceResponse(Outcome value) {
return new JAXBElement<Outcome>(_ServiceResponse_QNAME, Outcome.class, null, value);
}
Je fichier le serveur attend à ce que ceci pour résoudre le problème. Mais au lieu de cela j'obtiens:
java.lang.IllegalStateException:
Aucun adaptateur d'extrémité [public javax.xml.bind.JAXBElement dortman.annoté.MyTestEndpoint.processFileRequest(dortman.xsd.objets.ServiceRequest)]:
Est-ce que votre point de terminaison de mettre en œuvre une prise en charge de l'interface comme MessageHandler ou PayloadEndpoint?
au org.springframework.ws.serveur.MessageDispatcher.getEndpointAdapter(MessageDispatcher.java:283)
au org.springframework.ws.serveur.MessageDispatcher.dispatch(MessageDispatcher.java:226)
au org.springframework.ws.serveur.MessageDispatcher.recevoir(MessageDispatcher.java:169)
au org.springframework.ws.de transport.de soutien.WebServiceMessageReceiverObjectSupport.handleConnection
(WebServiceMessageReceiverObjectSupport.java:89)
au org.springframework.ws.de transport.http.WebServiceMessageReceiverHandleradapter.poignée
(WebServiceMessageReceiverHandleradapter.java:57)
au org.springframework.ws.transport.http.MessageDispatcherServlet.doService(MessageDispatcherServlet.java:231)
au weblogic.servlet.interne.WebAppServletContext.execute(WebAppServletContext.java:2174)
au weblogic.servlet.interne.ServletRequestImpl.exécuter(ServletRequestImpl.java:1446)
au weblogic.travail.ExecuteThread.execute(ExecuteThread.java:201)
au weblogic.travail.ExecuteThread.exécuter(ExecuteThread.java:173)
Apparemment, il n'a pas été impressionné par mon utilisation de JAXBElement. Quelqu'un d'autre a rencontré ce problème?
Mon fichier de configuration (qui travaille déjà avec ~6 services web, c'est juste qu'aucun d'entre eux présentent ce particulier XSD variation) contient les éléments suivants:
<!-- JAXB marshaller to be used by the annotated web services -->
<bean class="org.springframework.ws.server.endpoint.adapter.MarshallingMethodEndpointAdapter">
<constructor-arg>
<bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="contextPath" value="dortman.xsd.objects" />
<property name="mtomEnabled" value="true"/>
</bean>
</constructor-arg>
</bean>
<bean id="messageFactory" class="org.springframework.ws.soap.axiom.AxiomSoapMessageFactory">
<property name="payloadCaching" value="true"></property>
<property name="attachmentCaching" value="true"></property>
</bean>
J'ai ajouté des informations à la base du poteau. Je n'ai même pas penser à l'inclure comme cela semble suffire pour plusieurs autres services web déjà. Je pense que j'ai juste besoin de l'étape et voir ce que le Printemps est en train de faire.
Ce fil a résolu mon problème: [forum.springsource.org/... ](forum.springsource.org/...)
OriginalL'auteur Dave | 2011-02-12
Vous devez vous connecter pour publier un commentaire.
Il est XSD, vous devez corriger votre XSD. Généralement, lorsque vous jouez avec JAXB, ce problème se produit, vous devez définir la demande et de la réponse correctement.
Ce problème est résolu. Par exemple, si votre demande d'entrée de l'élément est "InsertRequest' donc nécessaire de définir comme
Auparavant, j'étais défini ce comme indiqué ci-dessous:- alors, quand je suis création de JAXB haricots il crée toujours de deux éléments, l'élément (
InsertRequest
ouInsertRequestType
) besoin de se référer au point de terminaison, c'était la question.OriginalL'auteur Vivek
Quand j'ai eu ce problème, la réponse s'est avéré être que j'avais oublié d'inclure l'élément de la classe dans la liste des classesToBeBound pour le Printemps Jaxb2Marshaller. En l'ajoutant à la liste résolu le problème - mais nos éléments ont déjà été mis en place avec une ligne de type complexe.
OriginalL'auteur Peter Hart
Vous voyez ce message d'erreur parce que JAXB ne sais pas quel nom donner à l'élément racine lorsque vous renvoyer un objet de type de Résultat. Si vous êtes de la génération des éléments du schéma je voudrais vous demandons d'avoir une ServiceResponse classe que vous pourriez revenir à la place.
Si vous ne pouvez pas obtenir un ServiceResponse objet, j'aurais pensé que votre approche de l'emballage le Résultat dans un JAXBElement devrait fonctionner. Avez-vous vérifié que _ServiceResponse_QNAME est construit avec le bon URI d'espace de noms?
Pourriez vous s'il vous plaît jeter un oeil à cette question, merci de vous! stackoverflow.com/questions/19032798/...
OriginalL'auteur rjsang