将继承更改为现有jaxb类结构的组合,保持当前xml结构不变

时间:2013-06-10 22:13:12

标签: java inheritance marshalling composition jaxb2

在我的代码库中,我有B extdnds A,但我想做到:B uses A。这是我的尝试:

@XmlAccessorType(XmlAccessType.NONE)
public class A {

    @XmlElement(name ="aString")
    private String aString;

B类包含A(组成):

@XmlAccessorType(XmlAccessType.NONE)
public class B {

    @XmlElement
    private A a = new A(); // has A

    @XmlElement
    private String bString;

有Root包含B

列表
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class ABs {

    @XmlElement(name = "b-list")
    private final List<B> bList = Constraints.constrainedList(new ArrayList<B>(), Constraints.notNull());


    public void add(B...bb) {
        for(B b : bb) {
            bList.add(b);
        }
    }
}

我的测试,将Bs编组到Systetem.out

 ABs abs = new ABs();
        abs.add( new B("bStringValue", "aStringValue"));

        JAXBContext context = JAXBContext.newInstance(ABs.class);

        Marshaller m = context.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

        m.marshal(abs, System.out);

结果:

<aBs>
    <b-list>
        <a>
            <aString>aStringValue</aString>
        </a>
        <bString>bStringValue</bString>
    </b-list>
</aBs>

但我想要这样的结果:好像我使用继承。就像B extends A

一样
<aBs>
    <b-list>
        <aString>aStringValue</aString>
        <bString>bStringValue</bString>
    </b-list>
</aBs>

我该怎么做?

修改

问题实在是:如果在B类中使用A类时,如何省略/忽略标记<a>。即不要编组到<a>,而是编组<a>

内的所有字段/标记

像:

@XmlElement(name = "") // empty
private A a = new A();

但这不起作用

2 个答案:

答案 0 :(得分:1)

答案在这里:

Is it possible to ignore a wrapper class during JAXB marshalling

答案是:不可能

实际上我的问题是那个问题的重复。但我的问题与 问题的架构方面 有关。

似乎JAXB不是最好用的东西如果你想像以前一样使用XML结构(想象XMLREST API你不应该改变,但是你仍然希望改变它周围的类)但是改变了类相互连接的方式。

它(jaxb打破了自由。课程变得有点(我的意思太多)贫血 ..

答案 1 :(得分:0)

试试这个

@XmlAccessorType(XmlAccessType.NONE)
public class B {

@XmlElement
private String aString;// you don't need to create the class A (aString  is like bString lement)

@XmlElement
private String bString;