我们有这个 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
会员和no内部类:
@XmlElement(name = "ValueB")
protected boolean valueB;
你怎么能这样做呢?
我不想重新生成类,我只想手动更改代码。
Update:根据已接受的答案,我们创建了一个新方法,根据 valueB == null 是否返回布尔值。
当我们使用 Hibernate 时,我们将 valueB 注释为@Transient
并用 Hibernate 的注释布尔 getter@Column
注解。
使用 XmlAdapter:
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
(not a boolean
) field:
@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;
}
}
这应该产生<isPresent/>
true 时为元素,为 false 时省略它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)