几天来,关于 JAX-WS Web 服务,我面临着一个恼人的错误。我打算使用使用自定义类型(基本上是“JAX-WS 原始”类型的结构,例如 int、long 和 string)作为参数和返回值的方法生成一个 Web 服务。
这是我在尝试发布 Web 服务时遇到的异常:
线程“主”javax.xml.ws.WebServiceException 中的异常:类 org.econet.ecomanager.msgexchange.webservice.SendMessageReqType 在 com.sun.xml.ws.server.sei.EndpointArgumentsBuilder$ 处没有名称请求的属性DocLit.(EndpointArgumentsBuilder.java:608) 在 com.sun.xml.ws.server.sei.TieHandler.createArgumentsBuilder(TieHandler.java:143) 在 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) 在 com.sun.xml.ws.server.EndpointFactory.create(EndpointFactory.java:270) 在 com.sun.xml.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:147)在 com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:574) 在 com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:557) 在 com.sun .xml.ws.transport.http.server.EndpointImpl.createEndpoint(EndpointImpl.java:321) 在 com.sun.xml.ws.transport.http.server.EndpointImpl.publish(EndpointImpl.java:245) 在 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.bind.v2.runtime.JAXBContextImpl.getElementPropertyAccessor(JAXBContextImpl.java:985) 上 com.sun.xml 上的类 org.econet.ecomanager.msgexchange.webservice.SendMessageReqType 的有效属性.ws.db.glassfish.JAXBRIContextWrapper.getElementPropertyAccessor(JAXBRIContextWrapper.java:121) 在 com.sun.xml.ws.server.sei.EndpointArgumentsBuilder$DocLit.(EndpointArgumentsBuilder.java:596) ... 还有 16 个EndpointArgumentsBuilder$DocLit.(EndpointArgumentsBuilder.java:596) ... 还有 16 个EndpointArgumentsBuilder$DocLit.(EndpointArgumentsBuilder.java:596) ... 还有 16 个
Web服务接口是:
@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);
...
}
Web服务实现如下:
@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。
问题出在 JAXB 中,它无法解释数据类型以将它们转换为 XML 结构,但是到目前为止我所做的所有尝试都没有成功,尝试不同的注释。我搜索了很多,几乎所有可用的 JAX-WS 示例都只使用原始类型,少数使用复杂类型的示例也没有帮助。
有人知道我在做什么错吗?