在我的代码库中,我有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();
但这不起作用
答案 0 :(得分:1)
答案在这里:
Is it possible to ignore a wrapper class during JAXB marshalling
答案是:不可能。
实际上我的问题是那个问题的重复。但我的问题与 问题的架构方面 有关。
似乎JAXB不是最好用的东西如果你想像以前一样使用XML
结构(想象XML
是REST 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;