2011-02-12 25 views
8

我有一个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> 
+1

什么是您的上下文的配置是什么样子?你如何在那里配置JAXB编组器? – skaffman 2011-02-12 12:11:58

+0

我将这些信息添加到帖子的底部。我甚至没有想过要包含它,因为它似乎已经足够用于其他几个Web服务。我想我只需要一步一步来看看Spring在做什么。 – Dave 2011-02-12 16:25:34

回答

0

您看到这个错误,因为JAXB没有按”当你返回一个类型为结果的对象时,知道给出根元素的名字。如果您正在生成从架构的元素我希望你有一个ServiceResponse类,你可以返回来代替。

如果你不能得到一个ServiceResponse对象,我还以为你包裹在一个JAXBElement的成果应该工作的方式。您是否检查过_ServiceResponse_QNAME是否使用正确的名称空间URI构造的?

7

据XSD相关的问题,您需要更正您的XSD。通常,当您使用JAXB时,会出现此问题,您需要正确定义请求和响应。

此问题已得到解决。例如,如果你输入的请求元素是“InsertRequest”,因此需要定义像

<xs:element name="InsertRequest"> 
<xs:annotation> 
<xs:documentation>Root element for Record Insert Request</xs:documentation> 
</xs:annotation> 
<xs:complexType> 
<xs:sequence> 
<xs:element name="GeneralDetails" type="tns:GenralDetailsType"></xs:element> 
<xs:element name="FullDetails" type="tns:FullDetailsType"></xs:element> 
</xs:sequence> 
</xs:complexType> 
</xs:element> 

以前我定义这个如下所述: - 所以当我创建JAXB豆总是为此创建了两个元素,元素(InsertRequestInsertRequestType)需要在端点引用,这是问题。

<element name="InsertRequest" type="tns:InsertRequestType"></element> 


<complexType name="InsertRequestType"> 
<sequence> 
<element name="GeneralDetails" type="tns:GenralDetailsType"></element> 
<element name="FullDetails" type="tns:FullDetailsType"></element> 
</sequence> 
</complexType> 
1

当我有这个问题,得到的答案竟然是,我已经忘了,包括在classesToBeBound为春Jaxb2Marshaller列表中的元素类。将这些添加到列表中可以解决问题 - 但我们的元素已经使用内联复杂类型进行设置。

相关问题