【发布时间】:2011-08-13 04:41:43
【问题描述】:
有如下玩具服务
@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 参数没有命名空间:
<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:GetStockPrice xmlns:ns2="http://www.example.org/stock">
<StockName>IBM</StockName>
</ns2:GetStockPrice>
</S:Body>
</S:Envelope>
我希望 StockName 生成为
<ns2:StockName>IBM</ns2:StockName>
即在目标名称空间中,而不是在匿名名称空间中(据我从消息中可以看出,ns2 不是默认名称)。
不知如何让JAX-WS将目标命名空间添加到消息的嵌套元素中?
尝试为 WebParam 注释指定命名空间没有任何改变,因为使用 RPC 时会忽略此参数。
或者...是不是说RPC风格的参数总是匿名的?
更新
我傻了。部分解决。我要做的是
- 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;
}
}
即使我尝试声明提供一个,客户端仍然期望没有任何命名空间的返回值。这令人困惑。
【问题讨论】:
-
上周我一直在这里发疯,因为我无法弄清楚为什么子元素没有命名空间。非常感谢老兄!
标签: java jax-ws rpc xml-namespaces