6 Stimmen

JAX-WS: Warum sind verschachtelte Elemente im ""-Namensraum?

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.

3voto

Daniel Kulp Punkte 14237

Dieses Verhalten ist gemäß dem WSI-Basic Profile korrekt. Wenn Sie sich das ansehen:

http://www.ws-i.org/profiles/basicprofile-1.1.html#Part_Accessors

Abschnitt 4.7.20, Behauptung R2735 besagt ausdrücklich, dass für RPC/Literal die Teil-Accessor-Elemente in Elemente ohne Namensraum gesetzt werden müssen.

1voto

Auch ich habe das gleiche Problem. Ich habe einen Webservice-Client entwickelt, der JAX-WS mit einer SOAP UI-Simulation verwendet, und mein Webservice-Client funktioniert einwandfrei, aber wenn ich mit einem echten Server (Axis Web Service) teste, erhalte ich Nullwerte. Ich bekam null Werte.

SOUP UI-Simulation Antwort wie diese

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.aml.infrasofttech.biz" xmlns:dat="http://dataobject.aml.infrasofttech.biz">
   <soapenv:Header/>
   <soapenv:Body>
      <web:getCIPMatchResponse>
         <!--1 or more repetitions:-->
         <web:getCIPMatchReturn>
            <dat:countries>?</dat:countries>
            <dat:dob>?</dat:dob>
            <dat:fullName>?</dat:fullName>
            <dat:isError>?</dat:isError>
            <dat:listName>?</dat:listName>
            <dat:passport>?</dat:passport>
            <dat:percentage>?</dat:percentage>
            <dat:sdnId>?</dat:sdnId>
            <dat:sdnName>?</dat:sdnName>
         </web:getCIPMatchReturn>
      </web:getCIPMatchResponse>
   </soapenv:Body>
</soapenv:Envelope>

Aber in der Server-Antwort mit aus Namespace wie diese.

        <countries>?</countries>
        <dob>?</dob>
        <fullName>?</fullName>
        <isError>?</isError>
        <listName>?</listName>
        <passport>?</passport>
        <percentage>?</percentage>
        <sdnId>?</sdnId>
        <sdnName>?</sdnName>

Der von JAX-WS generierte Code sieht wie folgt aus.

  @XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "SdnBean", namespace = "http://dataobject.aml.infrasofttech.biz", propOrder = {
    "countries",
    "dob",
    "fullName",
    "isError",
    "listName",
    "passport",
    "percentage",
    "sdnId",
    "sdnName"
})
public class SdnBean {

Dann habe ich den Client jax-ws Code @XmlType wie unten gezeigt geändert

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "countries",
    "dob",
    "fullName",
    "isError",
    "listName",
    "passport",
    "percentage",
    "sdnId",
    "sdnName"
})
public class SdnBean {

Damit wird die Soap-Antwort ohne Namespace gebunden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X