Tengo un servicio web que estoy tratando de implementar con Spring y Jaxb. Ya tengo un puñado de servicios que funcionan usando ambos, pero este servicio en particular me está causando problemas debido al formato de la respuesta. En mi XSD, la respuesta se define como esto (aviso de que se trata de un solo elemento):JAXB + Spring WS: "Sin adaptador para punto final" mientras usa JAXBElement
<!-- 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>
Tengo un método de servicio que tiene este aspecto:
@PayloadRoot(localPart = SERVICE_REQUEST, namespace = NAMESPACE)
public Outcome processFileRequest(ServiceRequest requestObject)
termino con una excepción que tiene este aspecto:
java.lang.IllegalStateException: No hay ningún adaptador de punto final [pública dortman.xsd.objects.Outcome dortman.annotated.MyTestEndpoint.processFileRequest (dortman.xsd.objects.ServiceRequest)]: ¿su endpoint im ¿Admite una interfaz compatible como MessageHandler o Payload Endpoint?
Después de encontrar algunas publicaciones relacionadas en el foro de Spring y Stackoverflow, parece que los objetos devueltos deben tener la anotación XmlRootElement o estar envueltos en un JAXBElement. Para probar el primero, he cambiado la respuesta en el XSD para:
<!-- Response definition -->
<element name="ServiceResponse">
<complexType>
<sequence>
<element name="FileSize" type="long"/>
</sequence>
</complexType>
</element>
que funciona, como JAXB a continuación, genera una clase ServiceResponse que tiene la anotación XmlRootElement. Desafortunadamente, no necesariamente tengo la libertad de alterar el XSD, lo que significa que necesito buscar la otra opción. Así que lo intenté. Mi nuevo método de servicio es el siguiente:
@PayloadRoot(localPart = SERVICE_REQUEST, namespace = NAMESPACE)
public JAXBElement<Outcome> processFileRequest(ServiceRequest requestObject)
Y luego envolver mi objeto de retorno utilizando el método que se creó en 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);
}
Cómo presento el servidor esperando esto para resolver el problema. Pero en lugar llego:
java.lang.IllegalStateException: No hay ningún adaptador de punto final [pública javax.xml.bind.JAXBElement dortman.annotated.MyTestEndpoint.processFileRequest (dortman.xsd.objects.ServiceRequest)]: ¿El su punto final implementa una interfaz compatible como MessageHandler o Payload Endpoint? en org.springframework.ws.server.MessageDispatcher.getEndpointAdapter (MessageDispatcher.java:283) en org.springframework.ws.server.MessageDispatcher.dispatch (MessageDispatcher.java:226) en org.springframework.ws.server. MessageDispatcher.receive (MessageDispatcher.java:169) en org.springframework.ws.transport.support.WebServiceMessageReceiverObjectSupport.handleConnection (WebServiceMessageReceiverObjectSupport.java:89) en org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter.handle (WebServiceMessageReceiverHandlerAdapter.java:57) en org.springframework.ws.transport.http.MessageDispatcherServlet.doService (MessageDispatcherServlet.java:231) en weblogic.servlet.interna l.WebAppServletContext.execute (WebAppServletContext.java:2174) en weblogic.servlet.internal.ServletRequestImpl.run (ServletRequestImpl.java:1446) en weblogic.work.ExecuteThread.execute (ExecuteThread.java:201) en WebLogic. work.ExecuteThread.run (ExecuteThread.java:173)
Aparentemente no me impresionó el uso de JAXBElement.¿Alguien más ha encontrado este problema?
Mi fichero de configuración (que ya está trabajando con ~ 6 servicios web, es sólo que ninguno de ellos presentan esta variación XSD particular) contiene lo siguiente:
<!-- 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>
¿Cómo se ve tu configuración de contexto? ¿Cómo ha configurado el Marshaller JAXB allí? – skaffman
Agregué esa información al final de la publicación. Ni siquiera pensé incluirlo, ya que parece ser suficiente para muchos otros servicios web. Creo que solo necesito dar un paso al frente y ver qué está haciendo Spring. – Dave
Este hilo resolvió mi problema: [http://forum.springsource.org/showthread.php?69728-No-adapter-for-endpoint-Does-your-endpoint-implement-a-supported-interface-like-Messa] (http://forum.springsource.org/showthread.php?69728-No-adapter-for-endpoint-Does-your-endpoint-implement-a-supported-interface-like-Messa) – Carlos