2

如果我在 Glassfish v2 下使用 JAXB 作为 Metro Web Services 的一部分,如何告诉 JAXB 添加:

 <xsd:any/> and <xsd:anyAttribute/>

标记到我生成的复杂类型,这样如果我将来进行更改以向我的响应对象添加元素或属性,那么我当前的客户端不会中断。

JAXB 文档似乎有些欠缺。

4

2 回答 2

1

只需使用 java.lang.Object 类型。JAXB 默认会生成 xsd:any。我已经成功地从 web 服务方法返回了一个 org.w3c.dom.Node 实例,java.lang.Object 作为返回类型。我想象 xsd:anyAttribute 会有类似的东西 - 也许使用 Object 返回类型和 XmlAttribute JAXB 注释?

补充:下面的注解看起来像是达到了你的目标。两者都是 JAXB 2.0 规范的一部分。

@XmlAnyAttribute @XmlAnyElement

于 2009-01-08T16:21:42.627 回答
1

好的,这就是我的工作方式:

import java.util.List;
import java.util.Map;
import javax.xml.bind.annotation.XmlAnyAttribute;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.namespace.QName;
import org.w3c.dom.Element;


public class SchemaExtensible
{
    @XmlAnyElement(lax=true)
    private List<Element> otherElements;

    @XmlAnyAttribute
    private Map<QName,Object> otherAttributes;
}

这并不理想,因为现在我必须为每个想要扩展的响应类扩展这个类(在某些情况下,这会阻止我从请求类扩展)。如果可以增强这 2 个方法和字段级别的注释以允许在类级别添加它们,那么他们可能只是说“将适当的标签添加到架构中,如果遇到就丢弃数据”,这将是甜蜜的。

架构片段最终看起来像这样:

<xs:complexType name="SchemaExtensible">
  <xs:sequence>
    <xs:any processContents="lax" namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:anyAttribute namespace="##other" processContents="skip"/>
 </xs:complexType>

对我来说,只允许响应对象的这种可扩展性比 Web 服务版本控制更可取,因为它允许您根据需要一点一点地发展模式,而无需管理许多不同版本的麻烦,也无需担心任何现有客户端如果您将单个新属性或元素添加到响应对象,则会中断。

于 2009-01-09T10:18:54.090 回答