我有一个Web服务,我试图使用Spring和Jaxb来实现。我已经有一些使用这两种服务的工作服务 - 但由于响应的格式,此特定服务给我带来了很大的困难。在我的XSD,响应的定义如下(请注意,这是一个单一的元素):JAXB + Spring WS:使用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>
我有一个看起来像这样的服务方法:
@PayloadRoot(localPart = SERVICE_REQUEST, namespace = NAMESPACE)
public Outcome processFileRequest(ServiceRequest requestObject)
我结束了一个异常看起来像这样:
java.lang.IllegalStateException: 无适配器端点[公共dortman.xsd.objects.Outcome dortman.annotated.MyTestEndpoint.processFileRequest(dortman.xsd.objects.ServiceRequest)]:请问您端点im是否支持MessageHandler或PayloadEndpoint等支持的接口?
在Spring论坛和Stackoverflow上找到一些相关的帖子后,似乎返回对象需要具有XmlRootElement注释或包装在JAXBElement中。要尝试第一,我改变了XSD的响应:
<!-- Response definition -->
<element name="ServiceResponse">
<complexType>
<sequence>
<element name="FileSize" type="long"/>
</sequence>
</complexType>
</element>
这样的作品,如JAXB然后生成具有XmlRootElement将注释的ServiceResponse类。不幸的是,我不一定有XSD的改变 - 这意味着我需要去追求另一种选择。所以我试了一下。我的新的服务方法是这样的:
@PayloadRoot(localPart = SERVICE_REQUEST, namespace = NAMESPACE)
public JAXBElement<Outcome> processFileRequest(ServiceRequest requestObject)
而我则使用了上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);
}
我提交了服务器期待这对解决问题。而是我得到:
java.lang.IllegalStateException: 无适配器端点[公共javax.xml.bind.JAXBElement dortman.annotated.MyTestEndpoint.processFileRequest(dortman.xsd.objects.ServiceRequest)]: 不你的端点实现一个支持的接口,如MessageHandler或PayloadEndpoint? at org.springframework.ws.server.MessageDispatcher.getEndpointAdapter(MessageDispatcher.java:283) at org.springframework.ws.server.MessageDispatcher.dispatch(MessageDispatcher.java:226) at org.springframework.ws.server。 MessageDispatcher.receive(MessageDispatcher.java:169) 在org.springframework.ws.transport.support.WebServiceMessageReceiverObjectSupport.handleConnection (WebServiceMessageReceiverObjectSupport.java:89) 在org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter.handle ( WebServiceMessageReceiverHandlerAdapter.java:57) at org.springframework.ws.transport.http.MessageDispatcherServlet.doService(MessageDispatcherServlet.java:231) at weblogic.servlet.interna l webAppServletContext.execute(WebAppServletContext.java:2174) at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1446) at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201) at weblogic。 work.ExecuteThread.run(ExecuteThread.java:173)
显然它并没有被我使用JAXBElement留下深刻的印象。有其他人遇到过这个问题吗?
我的配置文件(已与〜6个Web服务的工作,这只是他们没有表现出这种特别的XSD变化)包含以下内容:
<!-- 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>
什么是您的上下文的配置是什么样子?你如何在那里配置JAXB编组器? – skaffman 2011-02-12 12:11:58
我将这些信息添加到帖子的底部。我甚至没有想过要包含它,因为它似乎已经足够用于其他几个Web服务。我想我只需要一步一步来看看Spring在做什么。 – Dave 2011-02-12 16:25:34