2013-10-26 66 views
1

對於JAX-WS Web服務,我現在面臨着幾天內令人討厭的錯誤。我打算使用使用自定義類型(基本上是「JAX-WS原語」類型的結構,如int,long和string)作爲參數和返回值的方法來生成Web服務。JAX-WS Web服務中複雜類型的JAXB解析

這是例外嘗試發佈web服務時,我得到:

在線程異常「主要」 javax.xml.ws.WebServiceException:類 org.econet.ecomanager.msgexchange.webservice .SendMessageReqType不要 具有名稱請求的屬性,位於 com.sun.xml.ws.server.sei.EndpointArgumentsBuilder $ DocLit。(EndpointArgumentsBuilder.java:608) at com.sun.xml.ws.server。 sei.TieHandler.createArgumentsBuilder(TieHandler.java:143) at com.sun.xml.ws.server.sei.TieHandler。(TieHandler.java:115) 在com.sun.xml.ws.db.DatabindingImpl。(DatabindingImpl.java:112) 在 com.sun.xml.ws.db.DatabindingProviderImpl.create(DatabindingProviderImpl.java:75) 在 的com.sun .xml.ws.db.DatabindingProviderImpl.create(DatabindingProviderImpl.java:59) 在 com.sun.xml.ws.db.DatabindingFactoryImpl.createRuntime(DatabindingFactoryImpl.java:128) 在 com.sun.xml.ws .server.EndpointFactory.createSEIModel(EndpointFactory.java:436) at com.sun.xml.ws.server.EndpointFactory.create(EndpointFactory.java:270) at com.sun.xml.ws.server.EndpointFactory .createEndpoint(EndpointFactory.java:147) a t com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:574) at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:557) at com.sun.xml.ws.transport.http.server.EndpointImpl.createEndpoint(EndpointImpl.java:321) 在 com.sun.xml.ws.transport.http.server.EndpointImpl.publish(EndpointImpl.java:245 ) at com.sun.xml.ws.spi.ProviderImpl.createAndPublishEndpoint(ProviderImpl.java:134) at javax.xml.ws.Endpoint.publish(Endpoint.java:240)at org.econet.ecomanager。 msgexchange.webservice.EcoMsgExchangeSystemsSideWSPublisher.main(EcoMsgExchangeSystemsSideWSPublisher.java:8) 引起:javax.xml.bind.JAXBException:請求是不是一個有效在 com.sun.xml.ws 0屬性上在 com.sun.xml.bind.v2.runtime.JAXBContextImpl.getElementPropertyAccessor(JAXBContextImpl.java:985)類 org.econet.ecomanager.msgexchange.webservice.SendMessageReqType .db.glassfish.JAXBRIContextWrapper.getElementPropertyAccessor(JAXBRIContextWrapper.java:121) 在 com.sun.xml.ws.server.sei.EndpointArgumentsBuilder $ DocLit。(EndpointArgumentsBuilder.java:596) ...... 16多個

網絡服務接口是:

@WebService(serviceName = "EcoMsgExchangeSystemsSide", 
      targetNamespace="http://www.econet-cno.org/ecomsgexchange/ns", 
      portName = "EcoMsgExchangeSystemsSidePort") 
@BindingType (value = javax.xml.ws.soap.SOAPBinding.SOAP11HTTP_BINDING) 
public interface EcoMsgExchangeSystemsSide { 

    @WebMethod(operationName="sendMessage") 
    @RequestWrapper(className="org.econet.ecomanager.msgexchange.webservice.SendMessageReqType") 
    @ResponseWrapper(className="org.econet.ecomanager.msgexchange.webservice.SendMessageRespType") 
    @WebResult(name="sendMessageResp") 
    public SendMessageRespType sendMessage(@WebParam(name="request") SendMessageReqType request); 

... 

} 

的網絡服務實現如下:

@WebService(serviceName = "EcoMsgExchangeSystemsSideService", 
      portName = "EcoMsgExchangeSystemsSidePort", 
      targetNamespace="http://www.econet-cno.org/ecomsgexchange/ns", 
      endpointInterface="org.econet.ecomanager.msgexchange.webservice.EcoMsgExchangeSystemsSide") 
public class EcoMsgExchangeSystemsSideImpl implements EcoMsgExchangeSystemsSide { 

    public SendMessageRespType sendMessage(SendMessageReqType request) { 
     long messageId = sendMessage(request.getClientId(), request.getClientPassword(), request.getRecipientId(), 
       request.getFileName()+"."+request.getFileExtension(), request.getFileBytes()); 
     SendMessageRespType response = new SendMessageRespType(); 
     if(messageId != -1) { 
      response.setMessageId(messageId); 
      response.setSenderId(request.getRecipientId()); 
      response.setFileName(request.getFileName()); 
      response.setFileExtension(request.getFileExtension()); 
      return response; 
     } 
     else 
      return null; 
    } 

... 

} 

類SendMessageReqType和SendMessageRespType只是標註有@XmlRootElement並與定義的getter和setter一堆atributes的(保護)。

問題是JAXB無法解釋數據類型以便將它們轉換爲XML結構,但是我迄今爲止嘗試使用不同的註釋嘗試所有嘗試都沒有成功。我搜索了很多,幾乎所有可用的JAX-WS的例子都只使用原始類型,少數使用複雜類型的例子也沒有幫助。

任何人都知道我做錯了什麼?

回答

1

我設法解決了這個問題。實際上,這是使用多個具有相同名稱的Web服務方法/操作的結果,只是改變了它們之間的參數。在處理我們的服務時,Java是一種編程方法,這是不可接受的。更改方法名稱後,所有工作正常。

1

默認情況下JAX-WS參數類型被包裝。所以,你的PARAMS已經包裹着一些生成的元素,如sendMessagesendMessageResponse:加入@SOAPBinding(parameterStyle=ParameterStyle.BARE)您SEI

<xs:element name="sendMessage" type="tns:sendMessage"/> 
<xs:element name="sendMessageResponse" type="tns:sendMessageResponse"/> 
<xs:complexType name="sendMessage"> 
    <xs:sequence> 
     <xs:element minOccurs="0" name="request" type="tns:sendMessageReqType"/> 
    </xs:sequence> 
</xs:complexType> 
<xs:complexType name="sendMessageReqType"> 
    <xs:sequence/> 
</xs:complexType> 
<xs:complexType name="sendMessageResponse"> 
    <xs:sequence> 
     <xs:element minOccurs="0" name="sendMessageResp" type="tns:sendMessageRespType"/> 
    </xs:sequence> 
</xs:complexType> 
<xs:complexType name="sendMessageRespType"> 
    <xs:sequence/> 
</xs:complexType> 

<wsdl:message name="sendMessage"> 
    <wsdl:part element="tns:sendMessage" name="parameters"> 
    </wsdl:part> 
</wsdl:message> 
<wsdl:message name="sendMessageResponse"> 
    <wsdl:part element="tns:sendMessageResponse" name="parameters"> 
    </wsdl:part> 
</wsdl:message> 

如果你想使用自己的包裝元素,而是生成者的切換到裸參數樣式(即EcoMsgExchangeSystemsSide )並刪除@ * Wrapper註釋(它們在這種形式中沒有意義)。結果將是:

<xs:complexType name="sendMessageReqType"> 
    <xs:sequence/> 
</xs:complexType> 
<xs:complexType name="sendMessageRespType"> 
    <xs:sequence/> 
</xs:complexType> 
<xs:element name="request" nillable="true" type="sendMessageReqType"/> 
<xs:element name="sendMessageResp" nillable="true" type="sendMessageRespType"/> 


<wsdl:message name="sendMessage"> 
    <wsdl:part element="tns:request" name="request"> 
    </wsdl:part> 
</wsdl:message> 
<wsdl:message name="sendMessageResponse"> 
    <wsdl:part element="tns:sendMessageResp" name="sendMessageResp"> 
    </wsdl:part> 
</wsdl:message> 
+0

謝謝@dawid的回答。實際上,我不想用我創建的包來替換生成的包裝類,我所需要的是將複雜類型用作參數並返回值。如果我替換默認生成的包裝器,我認爲對於客戶端來說,'SendMessageReqType'的每個類屬性將被假定爲sendMessage()的一個參數,對嗎?事實上,我的問題不是方法參數,我可以使用幾種基本類型而不是複雜類型。主要問題是返回值,我需要它不止一種類型,例如文件名和文件字節。 – tftdias

+0

我認爲你使用'@ * Wrapper'註解來替換生成的包裝。這是這些註釋的意圖。如果你不想替換包裝,那麼你不需要這些註釋。如果你刪除它們,那麼你得到你想要的 - 你將有複雜類型類的包裝類型。如果您可以指定您期望的WSDL或SOAP消息方面的內容,那麼幫助您會更容易。 –

+0

對不起@dawid這個遲到的反饋。我發現了這個問題,這是一個新手的錯誤。我使用相同的不同Web服務方法,只使用不同的參數。同時我試圖改變其中一個名字,瞧!問題解決了。 即使你的回答不是我所需要的,我認爲,考慮到我的問題描述,這是針對這類問題的有效答案。我應該將其標記爲已接受嗎? – tftdias