Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Web services JAX-WS web服务中复杂类型的JAXB解析_Web Services_Jakarta Ee_Jaxb_Jax Ws - Fatal编程技术网

Web services JAX-WS web服务中复杂类型的JAXB解析

Web services JAX-WS web服务中复杂类型的JAXB解析,web-services,jakarta-ee,jaxb,jax-ws,Web Services,Jakarta Ee,Jaxb,Jax Ws,关于JAX-WSWeb服务,几天来我一直面临一个恼人的错误。我打算使用使用自定义类型(基本上是“JAX-WS原语”类型的结构,如int、long和string)作为参数和返回值的方法生成一个web服务 这是我在尝试发布web服务时遇到的异常: 线程“main”javax.xml.ws.WebServiceException中的异常:类 org.econet.ecomanager.msgexchange.webservice.SendMessageReqType不允许 在处具有名称请求的属性 co

关于JAX-WSWeb服务,几天来我一直面临一个恼人的错误。我打算使用使用自定义类型(基本上是“JAX-WS原语”类型的结构,如int、long和string)作为参数和返回值的方法生成一个web服务

这是我在尝试发布web服务时遇到的异常:

线程“main”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.createAndPublishindPoint(ProviderImpl.java:134) 位于javax.xml.ws.Endpoint.publish(Endpoint.java:240) org.econet.ecomanager.msgexchange.webservice.ecomsgexchangesssidewSpublisher.main(ecomsgexchangesssidewSpublisher.java:8) 原因:javax.xml.bind.JAXBException:请求不是有效的 类上的属性 org.econet.ecomanager.msgexchange.webservice.SendMessageReqType位于 com.sun.xml.bind.v2.runtime.JAXBContextImpl.getElementPropertyAccessor(JAXBContextImpl.java:985) 在 com.sun.xml.ws.db.glassfish.JAXBRIContextWrapper.getElementPropertyAccessor(JAXBRIContextWrapper.java:121) 在 com.sun.xml.ws.server.sei.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的atribute(受保护)

问题在于JAXB无法解释数据类型以将其转换为XML结构,但我迄今为止所做的尝试都没有成功,只是尝试了不同的注释。我搜索了很多,几乎所有可用的JAX-WS示例都只使用基本类型,少数使用复杂类型的示例也没有帮助


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

默认情况下,JAX-WS参数类型是包装的。因此,您的参数已经包含了一些生成的元素,如
sendMessage
sendMessageResponse

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

我设法解决了这个问题。事实上,这是使用多个同名的web服务方法/操作的结果,只需更改参数即可对其进行查看。一种类似Java的编程方法,在处理we服务时是不可接受的。更改方法名称后,所有操作都正常。

谢谢@dawid的回答。事实上,我不想用我创建的类替换生成的包装器类,我想要的是使用复杂类型作为参数和返回值。如果我替换默认生成的包装器,我认为对于客户端,
SendMessageReqType
的每个类属性都将被假定为
sendMessage()
的参数,对吗?事实上,我的问题不是方法参数,我可以使用几种基本类型而不是复杂类型。主要问题是返回值,我需要不止一种类型,例如文件名和文件字节。我认为您可以使用
@*Wrapper
注释替换生成的Wrapper。这就是这些注释的意图。如果不想替换包装器,则不需要这些注释。如果您删除它们,那么您将得到您想要的——您将在复杂类型类周围拥有包装器类型。如果您可以指定您对WSDL或SOAP消息的期望值,那么将更容易为您提供帮助。我发现了这个问题,这是一个新手犯的错误。我使用了不同的web服务方法,但参数不同。与此同时,我试图改变其中一个名字,瞧!问题解决了。即使你的答案不是我所需要的,但考虑到我的问题描述,我认为这是对此类问题的有效答案。我应该把它标记为接受吗?@tftdias-我很高兴听到你设法解决了一个问题:)你最初的问题是>有人知道我做错了什么吗?如果你觉得我帮你解决了这个问题,那么请接受答案。如果没有,你仍然可以投票感谢我的努力:)如果你现在对一个问题了解更多,你还可以与其他人分享什么是症状(通过编辑问题)以及你如何处理问题(通过添加答案)。谢谢@dawid!问题得到了回答。
<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>