jaxbeclipselinkmoxyxsixsitype

EclipseLink MOXy: Suppress xsi:type when marshalling


I have a bindings file with the following content:

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

When I marshall the JavaType class using this binding, the XML looks like this

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

I don't want the xsi:type to be there, how can I suppress this when marshalling?


Solution

  • The xsi:type attribute will appear when you are marshalling a subclass. You can have it be suppressed by wrapping your object in a JAXBElement that supplies information about the root element including type.

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

    Example


    UPDATE

    Thanks. I now made the superclass XmlTransient, which makes the xsi:type disapear as well. I used the annotation to do that. Is there actually a way to use to make a java-type be transient? I could only make it work for java-attributes.

    You are correct. You can use @XmlTransient at the class level to have it removed from the inheritance hierarchy. Below is how this can be done using MOXy's external mapping document.

    <?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>
    

    For More Information