3

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

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

@SOAPBinding 定义为“文档/文字/包装”

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,但我更喜欢使用 Wrapped 来解决这个问题,因为所有信息都指向这是最广泛首选的绑定。

4

2 回答 2

3

为后人自答。

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

通宵审查 JAX-WS 规范

2.3.1.2 包装风格

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

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

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

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

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

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

于 2012-03-31T10:42:14.187 回答
0

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

于 2012-12-04T14:01:47.223 回答