[英]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實現-有幾種: CXF , RI / Metro , Axis2 , JBossWS , Spring-WS等。-您可能需要調用不同的工具來生成工件( XSD Schema或WSDL ),即RI的wsimport ,或特定的JAX-WS實現工具,例如* Axis * 2或CXF的WSDL2Java或JBossWS的wsprovide 。
另外,根據您為項目設置的構建腳本/工具,可能會有任務,目標或目標可用於自動調用這些工具。 但是,當涉及到XML到Java綁定時,您可以利用JAXB Binding文檔來處理生成的Java類,包括對其生成到的位置(包)的處理。 這是通過jaxb:bindings完成的 ( jaxb只是一個名稱空間前綴)。 對於WSDL工件(即服務),可以將映射指令放在jaxws:bindings中 (此處jaxws只是XML名稱空間)。 請注意,這兩個是兩個單獨的綁定( XML )文檔,可以將它們提供給上述工具之一,即CXF的WSDL2Java或wsimport 。
對於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.java
在ab.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:bindings
與jaxws:bindings
)。 最后,您可以將這些綁定信息傳遞給實際工具,即CXF的WSDL2Java (在這種情況下,是來自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
標志接受綁定文檔( JAXB和JAX-WS )。 實際上,這些工具(如WSDL2Java )最終會調用的Binding Compiler(xjc)確實通過-b
選項接受了綁定文檔(請注意,該鏈接將您帶到Reference Implementation / Metor的xjc版本,但使用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.