JAX-WS: por que elementos aninhados estão no espaço de nome ""?
Ter um serviço de brinquedos como abaixo
@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;
}
}
O cliente gerado por JAX-WS cria uma mensagem SOAP em que o parâmetro StockName não possui espaço para nome:
<?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>
Eu esperaria e desejaria que o StockName fosse gerado como
<ns2:StockName>IBM</ns2:StockName>
i.e. no espaço para nome de destino, não no anônimo (ns2 não é o padrão, tanto quanto posso ver na mensagem).
quot;Gostaria de saber como fazer o JAX-WS adicionar o espaço de nome de destino aos elementos aninhados da mensagem?&quo
Uma tentativa de especificar o espaço para nome da anotação WebParam não mudou nada, pois esse parâmetro é ignorado quando o RPC é usad
Or ... Isso significa que os parâmetros no estilo RPC são sempre anônimos?
ATUALIZA
Illy me. Parcialmente resolvido. O que eu tinha que fazer é
style = Document, para habilitar namespaces de destino para elementosparam style = Embrulhado, para ativar o elemento de nível superiorspecify o namespace de destino para o WebParam (por que o serviço 1 não é usado? a documentação diz que o namespace do serviço deve ser usado)Isso é
@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;
}
}
Ainda, o cliente ainda espera um valor de retorno sem nenhum espaço para nome, mesmo que eu tente declarar fornecer um. Isso é confuso.