Mit einem Spielzeugservice wie unten
@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;
}
}
Der von JAX-WS generierte Client erstellt eine SOAP-Nachricht, bei der der Parameter StockName keinen Namespace hat:
<?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>
Ich würde erwarten und wünschen, dass StockName wie folgt generiert wird
<ns2:StockName>IBM</ns2:StockName>
d.h. im Ziel-Namensraum, nicht im anonymen (ns2 ist nicht Standard, soweit ich das aus der Meldung ersehen kann).
Ich frage mich, wie man JAX-WS dazu bringt, den Ziel-Namespace zu den verschachtelten Elementen der Nachricht hinzuzufügen?
Ein Versuch, den Namespace der WebParam-Annotation anzugeben, hat nichts geändert, da dieser Parameter bei der Verwendung von RPC ignoriert wird.
Oder ... Bedeutet es, dass Parameter im RPC-Stil immer anonym sind?
UPDATE
Ich Dummerchen. Teilweise gelöst. Was ich tun musste, ist
- style=Document, um Ziel-Namensräume für Elemente zu aktivieren
- param style=Wrapped, um das Element der obersten Ebene zu aktivieren
- Angabe des Ziel-Namensraums für WebParam (warum wird nicht der Dienst-Namensraum verwendet? laut Dokumentation sollte der Dienst-Namensraum verwendet werden)
Das heißt:
@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;
}
}
Dennoch erwartet der Client immer noch einen Rückgabewert ohne Namespace, auch wenn ich versuche, einen zu deklarieren. Dies ist verwirrend.