JAX-WS:为什么嵌套元素在“”命名空间中?

玩具服务如下

@WebService(targetNamespace="http://www.example.org/stock") @SOAPBinding(style=Style.RPC,parameterStyle=ParameterStyle.WRAPPED) public class GetStockPrice { @WebMethod(operationName="GetStockPrice",action="urn:GetStockPrice") @WebResult(partName="Price") public Double getPrice( @WebParam(name="StockName") String stock ) { return null; } } 

JAX-WS生成的客户端创建SOAP消息,其中StockName参数没有命名空间:

     IBM    

我希望并希望StockName生成为

  IBM 

即在目标名称空间中,而不是在匿名名称空间中(ns2不是默认的,据我所知,从消息中可以看出)。

我想知道如何让JAX-WS将目标命名空间添加到消息的嵌套元素中?

尝试将名称空间指定给WebParam注释时没有任何改变,因为在使用RPC时会忽略此参数。

或者……这是否意味着RPC风格的参数始终是匿名的?

UPDATE

傻我。 部分解决了。 我必须做的是

  • style = Document,为元素启用目标命名空间
  • param style = Wrapped,以启用顶级元素
  • 为WebParam指定目标命名空间(为什么不使用服务?文档说应该使用服务命名空间)

那是:

 @WebService(targetNamespace="http://www.example.org/stock") @SOAPBinding(style=Style.DOCUMENT,parameterStyle=ParameterStyle.WRAPPED) public class GetStockPrice { @WebMethod(operationName="GetStockPrice",action="urn:GetStockPrice") @WebResult(partName="Price") public Double getPrice( @WebParam(name="StockName",targetNamespace="http://www.example.org/stock") String stock ) { return null; } } 

尽管如此,客户端仍然希望返回值没有任何命名空间,即使我尝试声明提供一个。 这令人困惑。

根据WSI-Basic Profile,此行为是正确的。 如果你看看:

http://www.ws-i.org/profiles/basicprofile-1.1.html#Part_Accessors

在第4.7.20节中,断言R2735明​​确指出对于RPC / Literal,必须将部分访问器元素放在没有namspace的元素中。

我也有同样的问题。 我使用SOAP UI模拟开发了使用JAX-WS的webservice客户端。我的webservice客户端工作正常。 但是当我用真实服务器(轴web服务)测试时。 我得到了空值。

这样的SOUP UI模拟响应

        ? ? ? ? ? ? ? ? ?     

但是在服务器中它会响应这样的命名空间。

  ? ? ? ? ? ? ? ? ? 

JAX-WS生成的代码如下所示。

  @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "SdnBean", namespace = "http://dataobject.aml.infrasofttech.biz", propOrder = { "countries", "dob", "fullName", "isError", "listName", "passport", "percentage", "sdnId", "sdnName" }) public class SdnBean { 

然后我更改了客户端jax-ws代码@XmlType,如下所示

 @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "countries", "dob", "fullName", "isError", "listName", "passport", "percentage", "sdnId", "sdnName" }) public class SdnBean { 

现在这将绑定没有命名空间的soap响应。