JAX-WS: pourquoi éléments imbriqués sont en “” espace de noms?

Avoir un jouet de service comme ci-dessous

@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 généré par client crée un message SOAP où StockName paramètre n'a aucun espace de noms:

<?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>

Je l'espère et souhaite StockName être généré comme

  <ns2:StockName>IBM</ns2:StockName>

c'est à dire dans l'espace de noms cible, pas dans l'anonymat d'un (ns2 n'est pas par défaut, aussi loin que je peux voir dans le message).

Je me demande comment faire JAX-WS pour ajouter l'espace de noms cible pour les éléments imbriqués du message?

Une tentative de spécifier l'espace de noms de WebParam annotation n'a rien changé car ce paramètre est ignoré lors de la RPC est utilisé.

Ou... Est-ce que cela signifie que les paramètres de style RPC sont toujours anonymes?

Mise à JOUR

Je suis bête. Partiellement résolu. Ce que j'avais à faire est de

  • style=Document, afin de permettre à la cible des espaces de noms pour les éléments
  • param style=Enveloppé, pour activer l'élément de niveau supérieur
  • spécifier l'espace de noms cible pour WebParam (pourquoi le service n'est pas utilisé? la documentation dit espace de noms du service devrait être utilisé)

Qui est:

@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;
    }
}

Encore, le client attend de valeur de retour, sans espace de noms, même si j'essaie de le déclarer en fournir un. Ceci est source de confusion.

J'ai été en train de devenir folle ici pour la dernière semaine parce que je ne pouvais pas comprendre pourquoi les éléments d'enfant avait aucun espace de noms. Merci beaucoup mec!

OriginalL'auteur Vladimir Dyuzhev | 2011-04-26