JAX-WS: почему вложенные элементы находятся в "" пространстве имен? - PullRequest
5 голосов
/ 26 апреля 2011

Сервис игрушек, как показано ниже

@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'?>
<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 всегда анонимны?

UPDATE

Глупый я. Частично решено. Что я должен был сделать, это

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

Тем не менее, клиент по-прежнему ожидает возвращаемого значения без какого-либо пространства имен, даже если я пытаюсь объявить его. Это сбивает с толку.

Ответы [ 2 ]

3 голосов
/ 26 апреля 2011

Это поведение соответствует профилю WSI-Basic.Если вы посмотрите:

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

раздел 4.7.20, утверждение R2735 определенно утверждает, чтодля RPC / Literal элементы средства доступа к детали должны быть помещены в элементы без пространства имен.

1 голос
/ 20 января 2012

У меня тоже такая же проблема. Я разработал клиент веб-сервиса, используя JAX-WS, с имитацией пользовательского интерфейса SOAP. Мой клиент веб-сервиса работает нормально. но когда я тестирую с реальным сервером (веб-сервис оси). Я получил нулевые значения.

SOUP UI симуляция, как это

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

Но на сервере он отвечает без пространства имен, как это ..

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

Сгенерированный код JAX-WS выглядит следующим образом.

  @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 {

Затем я изменил код jax-ws клиента @XmlType, как показано ниже

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

Теперь это свяжет мыльный ответ без пространства имен.

...