【问题标题】:JAX-WS: why nested elements are in "" namespace?JAX-WS:为什么嵌套元素在“”命名空间中?
【发布时间】:2011-08-13 04:41:43
【问题描述】:

有如下玩具服务

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

即使我尝试声明提供一个,客户端仍然期望没有任何命名空间的返回值。这令人困惑。

【问题讨论】:

  • 上周我一直在这里发疯,因为我无法弄清楚为什么子元素没有命名空间。非常感谢老兄!

标签: java jax-ws rpc xml-namespaces


【解决方案1】:

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

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

第 4.7.20 节,断言 R2735 明确指出,对于 RPC/Literal,部件访问器元素必须放在没有命名空间的元素中。

【讨论】:

  • 这是一个有趣的答案/参考文档,但我的理解是它只适用于 RPC/Literal 而不是 Document/Literal - 它应该具有正确的命名空间和前缀。 WSDL 规范中有一个示例 SOAP 请求,其中包含子命名空间前缀:w3.org/TR/wsdl#_Toc492291097 JAX-WS 即使在“文档”模式下似乎也尊重/包含正确的 XML 命名空间 - 我是否还缺少另一个规范?
  • "elementFormDefault" 这对于查看 WSDL 是否定义 &lt;StockName&gt;IBM&lt;/StockName&gt; 是否为命名空间前缀非常重要。
【解决方案2】:

我也有同样的问题。 我使用 JAX-WS 开发了带有 SOAP UI 模拟的 Web 服务客户端。我的 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响应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    相关资源
    最近更新 更多