Having a toy service as below
@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-generated client creates a SOAP message where StockName parameter has no namespace:
<?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>
I would expect and wish StockName to be generated as
<ns2:StockName>IBM</ns2:StockName>
i.e. in the target namespace, not in the anonymous one (ns2 is not default, as far as I can see from the message).
I wonder how to make JAX-WS to add the target namespace to the nested elements of the message?
An attempt to specify the namespace to WebParam annotation changed nothing as this param is ignored when RPC is used.
Or... Does it mean that parameters in RPC-style are always anonymous?
UPDATE
Silly me. Partially solved. What I had to do is
- style=Document, to enable target namespaces for elements
- param style=Wrapped, to enable top level element
- specify target namespace for WebParam (why service one is not used? documentation says service namespace should be used)
That is:
@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;
}
}
Still, client still expects return value without any namespace, even if I try to declare provide one. This is confusing.