如何提取JAX-WS @RequestWrapper属性(或完整bean)

时间:2012-03-30 22:18:07

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

是否可以从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的值状态实体来自@WebParam),但有没有办法访问该值(处理)状态。据我所知,WebParam不支持属性,只支持元素。

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

我知道如果我转换到Document / Literal / Bare我可以简单地让参数和返回值反映bean,但我更愿意使用包装作为所有信息点解决这个问题,这是最广泛使用的绑定。

2 个答案:

答案 0 :(得分:3)

后人自我回答。

没有。要符合包装样式,只能存在元素。

一夜之间审查JAX-WS规范

  
    
      

2.3.1.2包装样式

             

只有满足以下条件时,WSDL操作才有资格进行包装器样式映射:

             

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

             

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

             

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

             

(iv)输入和输出消息(如果存在)部分引用的元素(以下称为       包装器元素)都是使用xsd:sequence compositor

定义的复杂类型              

(v)包装元素只包含子元素,它们必须不包含其他结构       作为通配符(元素或属性),xsd:choice,替换组(元素引用不是       允许的)或属性;此外,它们不能是无罪的。

    
  

答案 1 :(得分:0)

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