从Moxy中的编组泛型类型中排除类型元素

时间:2014-07-31 23:20:14

标签: java generics jaxb moxy xmltransient

我使用Moxy 2.5.1将对象编组到json。该对象扩展了一个泛型类。我不想输入类型元素,所以我尝试按照http://blog.bdoughan.com/2011/06/ignoring-inheritance-with-xmltransient.html上的示例进行操作。

如果标记为@XmlTransient的类不是通用的,那么该过程有效,但如果它是通用的,则始终输出type元素。

这是一个公认的人为例子:

public class AB {
    @XmlElement
    String a = "A";
    @XmlElement
    String b = "B";
}

@XmlTransient
public class Value {
    @XmlElement
    @XmlPath(".")
    AB value = new AB();
}

@XmlRootElement
public class Record extends Value {
    @XmlElement
    int id = 1;
}

我使用以下代码编组记录:

JAXBContext jaxbContext =
    org.eclipse.persistence.jaxb.JAXBContextFactory
        .createContext(
            new Class[]{ Record.class, AB.class}, null);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON);
marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false);
Record record = new Record();
marshaller.marshal(record, System.out);

并获得以下输出:

{"a":"A","b":"B","id":1}

现在,如果我尝试以下内容:

@XmlTransient
public class ValueGeneric<T> {
    @XmlElement
    @XmlPath(".")
    T value;
}

@XmlRootElement
public class RecordAB extends ValueGeneric<AB> {
    @XmlElement
    int id = 1;
}

使用编组代码(基本上与上面相同但注册RecordAB.class):

JAXBContext jaxbContext =
    org.eclipse.persistence.jaxb.JAXBContextFactory
        .createContext(
            new Class[]{RecordAB.class, AB.class}, null);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON);
marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false);
RecordAB recordAB = new RecordAB();
recordAB.value = new AB();
marshaller.marshal(recordAB, System.out);

它统计为:

{"type":"ab","a":"A","b":"B","id":1}

我希望它像第一个那样编组,没有类型元素。

我不需要解组,所以如果类型信息丢失就没问题。

如果我输出XML,会发生类似的事情; RecordAB的根元素具有以下属性集:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ab"

任何人都知道如何防止输出类型元素?

0 个答案:

没有答案