JAX-WS:为什么嵌套元素在“”命名空间中?

时间:2011-04-26 16:28:23

标签: java jax-ws rpc xml-namespaces

拥有以下玩具服务

@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风格的参数始终是匿名的?

更新

傻傻的我。部分解决了。我必须做的是

  • 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 个答案:

答案 0 :(得分:3)

根据WSI-Basic Profile,此行为是正确的。如果你看看:

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

第4.7.20节,断言R2735明​​确规定,对于RPC / Literal,必须将部分访问器元素放在没有namspace的元素中。

答案 1 :(得分:1)

我也有同样的问题。 我开发了使用JAX-WS的webservice客户端,使用SOAP UI模拟。我的webservice客户端工作正常。但是当我使用真实服务器(轴Web服务)进行测试时。我得到了空值。

这样的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 {

现在这将绑定没有命名空间的soap响应。