【问题标题】:How to extract JAX-WS @RequestWrapper attribute (or full bean)如何提取 JAX-WS @RequestWrapper 属性(或完整 bean)
【发布时间】:2012-04-14 14:50:13
【问题描述】:

是否可以从 RequestWrapper 对象中提取属性(如 XML 属性值)?

在我的实现中,我想使用属性的值,但不能用@WebParam 引用它,因为这仅适用于元素(我相信)

@SOAPBinding 被定义为“Document/Literal/Wrapped”

WSDL(相关部分,目标属性位于**):

<s:element name="GetStatus">
 <s:complexType>
  <s:element minOccurs="0" maxOccurs="1" name="Entity" type="s0:Entity"/>
**<s:attribute name="Handle" type="s:string"/>
 </s:complexType>
</s:element>
<s:element name="GetStatusResponse">
 <s:complexType>
  <s:sequence>
   <s:element minOccurs="0" maxOccurs="1" name="StatusCode" type="s0:StatusCode"/>
   <s:element minOccurs="0" maxOccurs="1" name="Server" type="s0:Server"/>
  </s:sequence>
 </s:complexType>
</s:element>

<message name="GetStatusIn">
 <part name="parameters" element="s0:GetStatus"/>
</message>
<message name="GetStatusOut">
 <part name="parameters" element="s0:GetStatusResponse"/>
</message>

<portType name="Service">
 <operation name="GetStatus">
  <input message="s0:GetStatusIn"/>
  <output message="s0:GetStatusOut"/>
 </operation>
</portType>

SEI 抽象方法(可以用 WebParam 指定 XML 元素):

@WebMethod(operationName="GetStatus")
@RequestWrapper(localName=“GetStatus",className="com.example.GetStatus")
@ResponseWrapper(localName=“GetStatusResponse",className="com.example.GetStatusResponse")
public void getStatus(
  @WebParam(name="Entity”)Entity entity,
  @WebParam(name="StatusCode",mode=WebParam.Mode.OUT)Holder<StatusCode> statusCode,
  @WebParam(name="Server", mode=WebParam.Mode.OUT)Holder<Server> server
);

实施:

@Override
public void getStatus(
  Entity entity,
  Holder<StatusCode> statusCode,
  Holder<Server> server
) { ... }

很明显我可以读取@RequestWrapper bean Status 的值(Entity 通过@WebParam),但是有什么方法可以访问该值(句柄)在状态中。据我了解,WebParam 不支持属性,只支持元素。

另一种询问/寻求解决方案的方法可能是询问如何访问 RequestWrapper 引用的完整 bean,在本例中为 GetStatus

我知道如果我转换到 Document/Literal/Bare,我可以简单地让参数和返回值反映 bean,但我更喜欢使用 Wrapped 来解决这个问题,因为所有信息都指向这是最广泛首选的绑定。

【问题讨论】:

    标签: soap wsdl jaxb jax-ws jax-ws-customization


    【解决方案1】:

    为后代自我回答。

    没有。要符合包装样式的条件,只有元素必须存在。

    一夜之间审查 JAX-WS 规范

    2.3.1.2 包装样式

    仅当满足以下条件时,WSDL 操作才有资格使用包装器样式映射:

    (i) 操作的输入和输出消息(如果存在)每个只包含一个部分

    (ii) 输入消息部分是指一个全局元素声明,其localname等于操作名

    (iii) 输出消息(如果存在)部分引用全局元素声明

    (iv) 输入和输出消息(如果存在)部分引用的元素(以下称为 包装元素)都是使用 xsd:sequence 合成器定义的复杂类型

    (v) 包装元素仅包含子元素,它们不得包含其他结构,例如 作为通配符(元素或属性)、xsd:choice、替换组(元素引用不是 允许)或属性;此外,它们不得为 nillable。

    【讨论】:

      【解决方案2】:

      非元素也可以存在,只要它们包含在 javax.xml.ws.Holder 对象中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-26
        • 2015-03-29
        • 1970-01-01
        • 1970-01-01
        • 2011-08-04
        • 2011-08-21
        • 1970-01-01
        相关资源
        最近更新 更多