Сервис игрушек, как показано ниже
@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 всегда анонимны?
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;
}
}
Тем не менее, клиент по-прежнему ожидает возвращаемого значения без какого-либо пространства имен, даже если я пытаюсь объявить его. Это сбивает с толку.