拥有以下玩具服务
@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风格的参数始终是匿名的?
更新
傻傻的我。部分解决了。我必须做的是那是:
@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;
}
}
尽管如此,客户端仍然希望返回值没有任何命名空间,即使我尝试声明提供一个。这很令人困惑。
答案 0 :(得分:3)
根据WSI-Basic Profile,此行为是正确的。如果你看看:
http://www.ws-i.org/profiles/basicprofile-1.1.html#Part_Accessors
第4.7.20节,断言R2735明确规定,对于RPC / Literal,必须将部分访问器元素放在没有namspace的元素中。
答案 1 :(得分:1)
我也有同样的问题。 我开发了使用JAX-WS的webservice客户端,使用SOAP UI模拟。我的webservice客户端工作正常。但是当我使用真实服务器(轴Web服务)进行测试时。我得到了空值。
这样的SOUP UI模拟响应
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.aml.infrasofttech.biz" xmlns:dat="http://dataobject.aml.infrasofttech.biz">
<soapenv:Header/>
<soapenv:Body>
<web:getCIPMatchResponse>
<!--1 or more repetitions:-->
<web:getCIPMatchReturn>
<dat:countries>?</dat:countries>
<dat:dob>?</dat:dob>
<dat:fullName>?</dat:fullName>
<dat:isError>?</dat:isError>
<dat:listName>?</dat:listName>
<dat:passport>?</dat:passport>
<dat:percentage>?</dat:percentage>
<dat:sdnId>?</dat:sdnId>
<dat:sdnName>?</dat:sdnName>
</web:getCIPMatchReturn>
</web:getCIPMatchResponse>
</soapenv:Body>
</soapenv:Envelope>
但是在服务器中它会像这样响应名称空间。
<countries>?</countries>
<dob>?</dob>
<fullName>?</fullName>
<isError>?</isError>
<listName>?</listName>
<passport>?</passport>
<percentage>?</percentage>
<sdnId>?</sdnId>
<sdnName>?</sdnName>
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响应。