wsimport缺少单个操作的@WebMethod

时间:2012-06-22 08:51:41

标签: java web-services cxf axis wsimport

我正在尝试为http://v3.core.com.productserve.com/ProductServeService.wsdl

定义的Web服务生成Java客户端

我已经尝试过来自CXF和Axis2的Java的wsimport和wsdl2java。

e.g。

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

这三个产生ApiPortType.java同样的问题。 getProductList方法的返回类型为void,没有@WebResult注释。 WSDL中的所有其他操作都被映射到java代码。

我详细查看了WSDL,但无法发现问题可能是什么以及为什么所有3个工具都无法为操作生成正确的返回类型。

有什么想法吗?

1 个答案:

答案 0 :(得分:5)

此Web服务属于文档文字包装 Web服务的类别。以下几点是正确的:

  • Binding是document / literal
  • 操作(getProductList())输入/输出消息包含一个wsdl:part
  • 请求部分引用与操作
  • 同名的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;