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>
Quel est votre contexte config? Comment avez-vous configuré la JAXB marshaller là?
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