自动生成CXF不正确的WSDL?

时间:2015-12-02 12:21:31

标签: header wsdl cxf

我在最近两天遇到同样的问题并且我不知道如何解决这个问题。甚至不确定是否是错误。

我有一个我认为非常奇怪的CXF Web服务,我想解决。这是Web服务处理的一个调用:

@WebResult (name="merchantHierarchyParentResponse") MerchantHierarchyParentResponseDTO
getParent(
        @WebParam(name="institutionNumber") @XmlElement(required=true) String institutionNumber,
        @WebParam(name="clientNumber") String clientNumber,
        @WebParam(name="ourReference") String ourReference,
        @WebParam(name="accessMerch") String accessMerch,
        @WebParam(header=true, name="callerId") String callerId,
        @WebParam(header=true, name="timestamp") String timestamp,
        @WebParam(header=true, name="signature") String signature
);

如您所见,它在标题中接收了4个普通参数和3个额外参数(callerId,timestamp和signature)。

它成功编译。然后我也在WebLogic服务器中成功部署它。

最后,我使用SoapUI来测试它。我为SoapUI提供了WebLogic为我提供WSDL的URL。这是,我没有对自动生成的WSDL进行任何更改。这就是我在SoupUI中为这个getParent获取的内容:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webService.webservice.omnipay.com.server/">
   <soapenv:Header>
      <web:signature>?</web:signature>
      <web:timestamp>?</web:timestamp>
      <web:callerId>?</web:callerId>
   </soapenv:Header>
   <soapenv:Body>
      <web:getParent>
         <institutionNumber>?</institutionNumber>
         <!--Optional:-->
         <clientNumber>?</clientNumber>
         <!--Optional:-->
         <ourReference>?</ourReference>
         <!--Optional:-->
         <accessMerch>?</accessMerch>
      </web:getParent>
      <web:callerId>?</web:callerId>
      <web:timestamp>?</web:timestamp>
      <web:signature>?</web:signature>
   </soapenv:Body>
</soapenv:Envelope>

我的问题很清楚。我在标题部分看到了3个参数(callerId,timestamp和signature),但为什么这3个参数在正文部分的末尾是AGAIN。我不希望它们出现在身体部位,我只希望它们位于标题中。

知道为什么会这样吗?这是一个错误吗?

1 个答案:

答案 0 :(得分:0)

嗨,感谢帮助我解决问题的人们。

这里wsdl:binding的部分与getParent调用有关:

<wsdl:binding name="ServiceImplServiceSoapBinding" type="tns:IService">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="getParent">
        <soap:operation soapAction="" style="document"/>
        <wsdl:input name="getParent">
            <soap:header encodingStyle="" message="tns:getParent" part="callerId" use="literal"/>
            <soap:header encodingStyle="" message="tns:getParent" part="timestamp" use="literal"/>
            <soap:header encodingStyle="" message="tns:getParent" part="signature" use="literal"/>
            <soap:body use="literal"/>
        </wsdl:input>
        <wsdl:output name="getParentResponse">
            <soap:body use="literal"/>
        </wsdl:output>
</wsdl:operation>

我必须更改部分,这一行

<soap:body use="literal"/>

这个

<soap:body use="literal" parts="parameters"/>

不太确定为什么在我自动生成的WSDL中没有生成这个部件属性,但是,它解决了我的问题。我不想在wsdl中进行这种手动更改。无论如何,至少我的问题是固定的。