我们有这个XML:
<Summary>
<ValueA>xxx</ValueA>
<ValueB/>
</Summary>
<ValueB/>
永远不会有任何属性或内部元素。它是一个布尔类型元素 - 它存在(true)或不存在(false)。
JAXB使用String valueA成员生成了一个Summary类,这很好。但是对于ValueB,JAXB生成了一个ValueB内部类和一个相应的成员:
@XmlElement(name = "ValueB")
protected Summary.ValueB valueB;
但我想要的是boolean
成员和没有内部类:
@XmlElement(name = "ValueB")
protected boolean valueB;
你怎么能这样做?
我不打算重新生成类,我想手动更改代码。
更新:根据接受的答案,我们创建了一个新方法,返回布尔值,条件是valueB == null。
当我们使用Hibernate时,我们用@Transient
注释了valueB,并使用Hibernate的@Column
注释注释了布尔getter。
答案 0 :(得分:7)
使用XmlAdaptor:
package com.example.xml.adaptor;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class BooleanToEmptyObjectAdapter extends XmlAdapter<EmptyObject, Boolean> {
@Override
public EmptyObject marshal(final Boolean v) {
return v != null && v ? new EmptyObject() : null;
}
@Override
public Boolean unmarshal(final EmptyObject v) {
return true;
}
}
它是一个虚拟对象,可以序列化:
package com.example.xml.adaptor;
public class EmptyObject {
// EMPTY
}
然后在您的对象中,使用Boolean
(不是boolean
)字段:
@XmlRootElement(name = "FooElement")
public class Foo {
@XmlElement()
@XmlJavaTypeAdapter(BooleanToEmptyObjectAdapter.class)
private final Boolean isPresent = false;
...
// You might need to @XmlTransient your getter/setter, or JAXB might complain about redefinition
@XmlTransient
public boolean isPresent() {
return this.isPresent;
}
}
如果为true,则应生成<isPresent/>
元素,但在false时将其省略。
答案 1 :(得分:1)
这是相当逻辑的jaxb创建了一个内部类,因为它认为这是一个commplexAttribute
如果你输入
,你也可以检查null == valueB
,而不是将其更改为布尔值
@XmlElement(name = "ValueB", nillable='true')
protected Summary.ValueB valueB;
在你的逻辑中。
或添加一个没有@XMl ....的额外getter并返回valueB的计算状态 也许你想要的是JAXB我以前不需要它。