1

几天来,关于 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 示例都只使用原始类型,少数使用复杂类型的示例也没有帮助。

有人知道我在做什么错吗?

4

2 回答 2

1

默认情况下 JAX-WS 参数类型被包装。所以你的参数已经被一些生成的元素包裹了,比如sendMessagesendMessageResponse

<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>

如果您想使用自己的包装元素而不是生成的元素,请通过添加@SOAPBinding(parameterStyle=ParameterStyle.BARE)到您的 SEI(即 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>
于 2013-10-26T19:35:15.920 回答
1

我设法解决了这个问题。实际上,这是使用多个具有相同名称的 Web 服务方法/操作的结果,只是更改了它们之间的参数。一种类似于 Java 的编程方法,在处理我们的服务时是不可接受的。更改方法名称后一切正常。

于 2013-11-08T11:35:21.657 回答