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