2

我有一个包含以下内容的绑定文件:

<java-type name="JavaType">
  <xml-root-element name="root"/>
  <java-attributes>
    ...
  </java-attributes>
</java-type>

当我使用此绑定编组 JavaType 类时,XML 看起来像这样

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="JavaType">

我不希望 xsi:type 在那里,编组时如何抑制它?

4

2 回答 2

1

xsi:type当您编组子类时,该属性将出现。您可以通过将对象包装在JAXBElement提供有关根元素(包括类型)的信息的 a 中来抑制它。

JAXBElement<JavaType> je = new JAXBElement(new QName(), JavaType.class javaType);
marshaller.marshal(je, System.out); 

例子


更新

谢谢。我现在创建了超类 XmlTransient,它也使 xsi:type 消失了。我使用注释来做到这一点。实际上有没有一种方法可以使 java-type 成为瞬态的?我只能让它适用于 java 属性。

你是对的。您可以@XmlTransient在类级别使用将其从继承层次结构中删除。下面是如何使用 MOXy 的外部映射文档来完成此操作。

<?xml version="1.0" encoding="UTF-8"?>
<xml-bindings 
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    package-name="com.example.foo">
     <java-types>
        <java-type name="Foo" xml-transient="true"></java-type>
     </java-types>
</xml-bindings>

了解更多信息

于 2013-11-22T18:21:04.197 回答
0

我尝试了@blaise-doughan 的建议,并将@XmlTransient注释添加到我的抽象基类的顶部。

在我的环境中(所以我的产品严格依赖某些东西),jaxb-api库显示“该位置不允许注释@XmlTransient”,因为它的版本可能高于2.1。我意识到,当我尝试使用包含版本>=2.1的新测试类路径添加注释时,它允许将其定义为类的顶部。

因此,让我直奔主题,我建议使用以下方法,以摆脱出现在从扩展类构建和编组的响应中出现的类型字段。

我只添加@XmlDiscriminatorNode("")到我的基类的顶部,我认为您正在使用 EclipseLink MOXy:

导入 org.eclipse.persistence.oxm.annotations.XmlDiscriminatorNode;

@XmlDiscriminatorNode("")
公共抽象类基{

    私人 int id;

    公共 int getId() {
        返回标识;
    }

    公共无效setId(int id){
        这个.id = id;
    }

}

总结一下,@XmlTransient如果您的jaxb-api版本大于2.1,则可以使用;如果您有 EclipseLink MOXy,则可以使用我的方法。

于 2014-12-26T09:51:18.990 回答