對於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的例子都只使用原始類型,少數使用複雜類型的例子也沒有幫助。
任何人都知道我做錯了什麼?
謝謝@dawid的回答。實際上,我不想用我創建的包來替換生成的包裝類,我所需要的是將複雜類型用作參數並返回值。如果我替換默認生成的包裝器,我認爲對於客戶端來說,'SendMessageReqType'的每個類屬性將被假定爲sendMessage()的一個參數,對嗎?事實上,我的問題不是方法參數,我可以使用幾種基本類型而不是複雜類型。主要問題是返回值,我需要它不止一種類型,例如文件名和文件字節。 – tftdias
我認爲你使用'@ * Wrapper'註解來替換生成的包裝。這是這些註釋的意圖。如果你不想替換包裝,那麼你不需要這些註釋。如果你刪除它們,那麼你得到你想要的 - 你將有複雜類型類的包裝類型。如果您可以指定您期望的WSDL或SOAP消息方面的內容,那麼幫助您會更容易。 –
對不起@dawid這個遲到的反饋。我發現了這個問題,這是一個新手的錯誤。我使用相同的不同Web服務方法,只使用不同的參數。同時我試圖改變其中一個名字,瞧!問題解決了。 即使你的回答不是我所需要的,我認爲,考慮到我的問題描述,這是針對這類問題的有效答案。我應該將其標記爲已接受嗎? – tftdias