繁体   English   中英

CXF:org.apache.cxf.interceptor.Fault:调用时arguments的编号错误

[英]CXF : org.apache.cxf.interceptor.Fault: wrong number of arguments while invoking

我正在使用 apache cxf 和 codegen maven 插件(均发布 3.1.11)实现一个简单的客户端。

这是我的示例 wsdl:

    <?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="urn:webServiceTest" xmlns:s0="urn:webServiceTest" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <wsdl:types>
  <xsd:schema elementFormDefault="qualified" targetNamespace="urn:webServiceTest">
   <xsd:element name="OpenTk" type="s0:InputMapping1"/>
   <xsd:complexType name="InputMapping1">
    <xsd:sequence>
     <xsd:element minOccurs="0" name="ID_NOTIFICA" type="xsd:string"/>
     <xsd:element minOccurs="0" name="ID_MESSAGGIO" type="xsd:string"/>
     <xsd:element minOccurs="0" name="DATA_ID_NOTIFICA" type="xsd:dateTime"/>
     <xsd:element minOccurs="0" name="DATA_ID_MESSAGGIO" type="xsd:dateTime"/>
     <xsd:element minOccurs="0" name="ID_RISORSA" type="xsd:string"/>
    </xsd:sequence>
   </xsd:complexType>
   <xsd:element name="APERTURATKResponse" type="s0:OutputMapping1"/>
   <xsd:complexType name="OutputMapping1">
    <xsd:sequence>
     <xsd:element minOccurs="0" name="CODICE" type="xsd:string"/>
     <xsd:element minOccurs="0" name="DESCRIZIONE" type="xsd:string"/>
     <xsd:element minOccurs="0" name="NOTE" nillable="true" type="xsd:string"/>
    </xsd:sequence>
   </xsd:complexType>

   <xsd:element name="AuthenticationInfo" type="s0:AuthenticationInfo"/>
   <xsd:complexType name="AuthenticationInfo">
    <xsd:sequence>
     <xsd:element name="userName" type="xsd:string"/>
     <xsd:element name="password" type="xsd:string"/>
     <xsd:element minOccurs="0" name="authentication" type="xsd:string"/>
     <xsd:element minOccurs="0" name="locale" type="xsd:string"/>
     <xsd:element minOccurs="0" name="timeZone" type="xsd:string"/>
    </xsd:sequence>
   </xsd:complexType>
  </xsd:schema>
 </wsdl:types>
   <wsdl:message name="OpenTkSoapOut">
      <wsdl:part element="s0:APERTURATKResponse" name="parameters">
      </wsdl:part>
   </wsdl:message>
   <wsdl:message name="OpenTkSoapIn">
      <wsdl:part element="s0:OpenTk" name="parameters">
      </wsdl:part>
   </wsdl:message>
   <wsdl:message name="ARAuthenticate">
      <wsdl:part element="s0:AuthenticationInfo" name="parameters">
      </wsdl:part>
   </wsdl:message>
   <wsdl:portType name="New_Port_0PortType">
      <wsdl:operation name="OpenTk">
         <wsdl:input message="s0:OpenTkSoapIn">
       </wsdl:input>
         <wsdl:output message="s0:OpenTkSoapOut">
       </wsdl:output>
      </wsdl:operation>
   </wsdl:portType>
   <wsdl:binding name="New_Port_0SoapBinding" type="s0:New_Port_0PortType">
      <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
      <wsdl:operation name="OpenTk">
         <soap:operation soapAction="urn:webServiceTest/OpenTk" style="document"/>
         <wsdl:input>
            <soap:header message="s0:ARAuthenticate" part="parameters" use="literal">
            </soap:header>
            <soap:body use="literal"/>
         </wsdl:input>
         <wsdl:output>
            <soap:body use="literal"/>
         </wsdl:output>
      </wsdl:operation>
   </wsdl:binding>
   <wsdl:service name="WebServicesFWCFFService">
      <wsdl:port binding="s0:New_Port_0SoapBinding" name="New_Port_0Soap">
         <soap:address location="http://localhost:9090/testService"/>
      </wsdl:port>
   </wsdl:service>
</wsdl:definitions>

我需要更改客户端端点,所以我决定使用 cxf.frontend 功能。 我创建了一个简单的客户端,并使用 api 来设置地址属性。 这是代码:

QName SERVICE = new QName("urn:webServiceTest", "WebServicesFWCFFService");

URL url = this.getClass().getClassLoader().getResource("testWsdl.wsdl").toURI().toURL();
            NewPort0PortType portType = new WebServicesFWCFFService(url, SERVICE).getNewPort0Soap();
            Client client = ClientProxy.getClient(portType);
            client.getRequestContext().put(Message.ENDPOINT_ADDRESS,address);

然后在我的单元测试中,我尝试调用服务(由 codegen 插件创建的服务):

ClientTest client = new ClientTest();
        Holder<String> code= new Holder<>();
        Holder<String> description= new Holder<>();
        Holder<String> notes= new Holder<>();
        client.portType.openTk("12","",
                null,null,"1",code, description, notes);
        assertNotNull(notes.value);
        assertNotNull(code.value);

but I receive a soap fault org.apache.cxf.binding.soap.SoapFault: wrong number of arguments while invoking public void it.test.cxf.impl.New_Port_0SoapImpl.openTk.

我发现问题似乎出在 org.apache.cxf.jaxws.interceptors.WrapperClassOutInterceptor 内部,特别是当这个拦截器使用 getHelperWrapper 方法创建 WrapperHelper class 时。 然后使用这个包装器使用 codegen 插件创建的 ObjectFactory (createWrapperObject(objs);) 创建 object。 这将产生一个新的 InputMappin1 object,所有字段为 null。

有人可以解释我这种行为以及如何避免这种行为吗? 我是否需要实现某种自定义拦截器或者我缺少一些配置?

我知道这是一个老问题,但这是我的 2 美分。

正如你所说,这似乎是 cxf 中的一个错误。 I got the same error exposing a SOAP service with JBoss, using JAX-WS annotations in source code (my approach is contract-last, I start with an annotated java class and let cxf generate the service with its WSDL).

为了克服这个问题,我将 SOAP 绑定样式指定为 DOCUMENT,并将参数样式指定为 WRAPPED。 我在服务 class 上使用了 JAX WS 注释:

@WebService
@SOAPBinding(
        style = SOAPBinding.Style.DOCUMENT, 
        parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
public class MySoapService

您可以在此处阅读有关 SOAP 绑定的更多详细信息。 无论如何,这会改变 XML 消息的结构,但 cxf 将为您处理所有细节。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM