2013-11-22 53 views
2

当类型我有一个绑定有以下内容的文件:禁止XSI的EclipseLink莫西:编组

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

当我马歇尔使用此绑定java类型类中,XML看起来像这样

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

我不希望xsi:类型在那里,如何在编组时抑制此问题?

回答

1

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

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


UPDATE

谢谢。我现在创建了超类XmlTransient,它也使得 xsi:type disapear成为可能。我用注释来做到这一点。有没有 实际上是一种使用java的方式来制作 的瞬态?我只能使它适用于java-attributes。

你是对的。您可以在类级别使用@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> 

更多信息

+1

谢谢。我现在创建了超类XmlTransient,它也使xsi:type disapear成为可能。我用注释来做到这一点。实际上有一种方法可以使用使java类型变为瞬态吗?我只能使它适用于java-attributes。 – hansi

+0

@hansi - 我已经用这些信息更新了我的答案。 –

0

我试图@布莱斯 - doughan的建议,并增加了@XmlTransient注解到我的抽象基类的顶部。

随着我的环境(所以我的产品取决于一些严格),该JAXB的API库说:“注释@XmlTransient不允许此位置”的,因为它的高可能早于2.1版本。我意识到,当我尝试添加包含版本> = 2.1的新测试类路径的注释时,它允许将其定义为类的顶部。

所以,让我直接点,我建议下面的方法,以摆脱类型字段出现在正在建设和从扩展类编组。

我只加@XmlDiscriminatorNode("")到我的基类的顶部,我假设你正在使用的EclipseLink莫西:

 
import org.eclipse.persistence.oxm.annotations.XmlDiscriminatorNode; 

@XmlDiscriminatorNode("") 
public abstract class Base { 

    private int id; 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

} 

作为总结,你可以使用@XmlTransient如果你有JAXB的API版本高比2.1或使用我的方法,如果你有EclipseLink MOXY。

相关问题