簡體   English   中英

相同的SOAP Web服務需要Java不同的參數類型嗎?

[英]Java different parameter type needed for identical SOAP Web Service?

我有一個Web服務客戶端,用於2個相同的SOAP Web服務,分別稱為Company1Service和Company2Service。 這兩個Web服務都具有完全相同的PurchaseOrder類。

但是,當我想從每個Web服務調用m1ProcessPurchaseOrder()方法和m2ProcessPurchaseOrder()方法時,它們要求Po對象使用不同的參數類型。 但是,這兩種服務的PurchaseOrder類是相同的。

我正在使用NetBeans和生成的源(jax-ws)。

public boolean m1ProcessPurchaseOrder(ab.service.company1.PurchaseOrder Po) 
{
    ab.service.company1.Company1Service port = service1.getComapny1ServicePort();
    return port.processPurchaseOrder(po);
}

public boolean m2ProcessPurchaseOrder(ab.service.company2.PurchaseOrder Po) 
{
    ab.service.company2.Company2Service port = service2.getComapny2ServicePort();
    return port.processPurchaseOrder(po);
}

我想做的是將ab.service.company1.PurchaseOrder和Company2Service的參數類型。

這是我的錯誤,如果我試圖改變m2ProcessPurchaseOrder()參數類型ab.service.company1.PurchaseOrder

接口Company2Service中的processPurchaseOrder方法不能應用於給定類型;

必需:ab.service.Company2.PurchaseOrder

找到:ab.service.Company1.PurchaseOrder

原因:實際參數ab.service.Company1.PurchaseOrder無法通過方法調用轉換轉換為ab.service.Company2.PurchaseOrder

根據您使用的JAX-WS實現-有幾種: CXFRI / MetroAxis2JBossWSSpring-WS。-您可能需要調用不同的工具來生成工件( XSD Schema或WSDL ),即RI的wsimport ,或特定的JAX-WS實現工具,例如* Axis * 2或CXFWSDL2JavaJBossWSwsprovide

另外,根據您為項目設置的構建腳本/工具,可能會有任務,目標或目標可用於自動調用這些工具。 但是,當涉及到XML到Java綁定時,您可以利用JAXB Binding文檔來處理生成的Java類,包括對其生成到的位置(包)的處理。 這是通過jaxb:bindings完成的jaxb只是一個名稱空間前綴)。 對於WSDL工件(即服務),可以將映射指令放在jaxws:bindings中 (此處jaxws只是XML名稱空間)。 請注意,這兩個是兩個單獨的綁定( XML )文檔,可以將它們提供給上述工具之一,即CXFWSDL2Javawsimport

對於JAXB綁定,可以創建一個類似( Company1Binding.xml )的綁定文檔:

<?xml version="1.0" encoding="UTF-8" ?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" version="2.1">

  <jaxb:bindings schemaLocation="PurchaseOrder.xsd">
    <jaxb:schemaBindings>
      <jaxb:package name="ab.service.common" />
    </jaxb:schemaBindings>
  </jaxb:bindings>

  <!-- more binding related to Company1Service -->

</jaxb:bindings>

以及Company2Binding.xml的JAXB綁定:

<?xml version="1.0" encoding="UTF-8" ?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" version="2.1">

  <jaxb:bindings schemaLocation="PurchaseOrder.xsd">
    <jaxb:schemaBindings>
      <jaxb:package name="ab.service.common" />
    </jaxb:schemaBindings>
  </jaxb:bindings>

  <!-- more binding related to Company2Service -->

</jaxb:bindings>

這會將一個生成的PurchaseOrder.java類放在ab.service.common包中,因此您可以從單個類( ab.service.common.PurchaseOrder.javaab.service.company1.*ab.service.company2.*引用該類的實例ab.service.company1.* ab.service.common.PurchaseOrder.java )。

請注意,如果您在某個時候對PurchaseOrder.xsd進行了更改,則在Company1和Company2中都放置了這種綁定,並且僅生成了其中一項服務即Company1的綁定。 在這種情況下,將為這兩個都重新生成PurchaseOrder.java,因為只有一個為它生成的類( ab.service.common.PurchaseOrder.java )。

您可以對WSDL工件進行相同的操作,例如對於Comapny1Service.wsdl ,您可以創建一個新的綁定文檔,例如( Company1ServiceBinding.xml ):

<?xml version="1.0" encoding="UTF-8"?>
<jaxws:bindings xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    version="2.1" xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
    wsdlLocation="Company1Service.wsdl">

    <jaxws:bindings node="wsdl:definitions">
        <jaxws:package
            name="ab.service.company1" />
    </jaxws:bindings>

    <jaxws:bindings
        node="wsdl:definitions/wsdl:portType/wsdl:operation/wsdl:fault[@name='fault']">
        <jaxws:class
            name="ab.service.common.ServiceException" />
    </jaxws:bindings>

</jaxws:bindings>

這會將服務類(例如接口,客戶端代理,以及您在WSDL中為操作指定的Soap Fault類型)放在ab.service.Company1包中。 注意每個綁定文檔中的名稱空間之間的差異( jaxb:bindingsjaxws:bindings )。 最后,您可以將這些綁定信息傳遞給實際工具,即CXFWSDL2Java (在這種情況下,是來自Ant構建文件的代碼片段):

<java classname="org.apache.cxf.tools.wsdlto.WSDLToJava" fork="true">
    <arg value="-d"/>
    <arg value="${path.to.generated.code}"/>
    <arg value="-b"/>
    <arg value="${path.to.artifacts}/Company1Binding.xml"/>
    <arg value="-b"/>
    <arg value="${path.to.artifacts}/Company1ServiceBinding.xml"/>
    <arg value="${path.to.artifacts}/Company1Service.wsdl"/>
    <classpath>
        <path refid="${jaxws.impl.library.path}"/>
    </classpath>
</java>

(注意: Company2Service應該有一個類似的目標)

如您所見,此特定工具通過-b標志接受綁定文檔( JAXBJAX-WS )。 實際上,這些工具(如WSDL2Java )最終會調用的Binding Compiler(xjc)確實通過-b選項接受了綁定文檔(請注意,該鏈接將您帶到Reference Implementation / Metorxjc版本,但使用CXF 's and others'應該接近)。 實際上,您可以直接調用WSDL2Java本身:

/path/to/wsdltojava -d /path/to/where/you/want/to/generate -b /path/to/wsdl/artifacts/CompanyBinding.xml -b /path/to/wsdl/artifacts/Company1ServiceBinding.xml /path/to/wsdl/artifacts/Company1Service.wsdl

使用JAXB進行映射需要使您熟悉一些細節,但是您可以在此處閱讀有關 JAX-WS RI / Metro的更多信息。 對於CXF ,可以參考這里 ,以及Maven的 CXF WSDL2Java 插件的示例。 同樣,每個JAX-WS實現都有自己的工具集,但是當涉及到與JAXB綁定的基礎映射/綁定時,這些概念是相同的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM