2012-06-22 60 views
0

我試圖通過http://v3.core.com.productserve.com/ProductServeService.wsdl的wsimport缺少@WebMethod單操作

來生成定義web服務,Java客戶端我已經試過Java的的wsimport和WSDL2Java來自CXF和Axis2。

例如

wsimport -p productserve -XadditionalHeaders http://v3.core.com.productserve.com/ProductServeService.wsdl 

所有這三個產生ApiPortType.java具有相同的問題。 getProductList方法的返回類型是void,並且沒有@WebResult註釋。來自WSDL的所有其他操作都被映射到Java代碼。

我已經詳細瞭解了WSDL,但無法發現問題的原因以及爲什麼所有3個工具都無法爲操作生成正確的返回類型。

任何想法?

回答

4

此Web服務屬於文檔文字包裝 Web服務的類別。以下幾點爲真:

  • 綁定是文檔/文本
  • 操作的(getProductList())進/出消息包含一個WSDL:一部分的每個
  • 請求一部分是指XSD元件用相同的名稱作爲操作
  • 響應部分是指XSD元素具有相同的名稱作爲操作+「響應」

所以,你必須void回報,但真的有4個結果

  • Holder<List<Product>> oProduct
  • Holder<Integer> iTotalCount
  • Holder<List<RefineByGroup>> oActiveRefineByGroup
  • Holder<List<RefineByGroup>> oRefineByGroup

CXF(使用wsimport)已經產生WRAPPED式操作。您還可以生成使用CXF的BARE風格:

wsdl2java -bareMethods http://v3.core.com.productserve.com/ProductServeService.wsdl 

這種方式,而不是:

@WebMethod 
@RequestWrapper(localName = "getProductList", targetNamespace = "http://v3.core.com.productserve.com/", className = "productserve.GetProductList") 
@ResponseWrapper(localName = "getProductListResponse", targetNamespace = "http://v3.core.com.productserve.com/", className = "productserve.GetProductListResponse") 
public void getProductList(
... 

你會得到:

@WebResult(name = "getProductListResponse", targetNamespace = "http://v3.core.com.productserve.com/", partName = "return") 
@WebMethod 
public GetProductListResponse getProductList(
    @WebParam(partName = "parameters", name = "getProductList", targetNamespace = "http://v3.core.com.productserve.com/") 
    GetProductList parameters 
) throws ApiException; 
+0

謝謝你的詳細解答。非常感激。 –