我们有这个XML:
<Summary>
<ValueA>xxx</ValueA>
<ValueB/>
</Summary>
Run Code Online (Sandbox Code Playgroud)
<ValueB/>永远不会有任何属性或内在元素.它是一个布尔类型元素 - 它存在(true)或不存在(false).
JAXB使用String valueA成员生成了一个Summary类,这很好.但是对于ValueB,JAXB生成了一个ValueB内部类和一个相应的成员:
@XmlElement(name = "ValueB")
protected Summary.ValueB valueB;
Run Code Online (Sandbox Code Playgroud)
但我想要的是boolean成员而没有内在阶级:
@XmlElement(name = "ValueB")
protected boolean valueB;
Run Code Online (Sandbox Code Playgroud)
你怎么能这样做?
我不打算重新生成类,我想手动更改代码.
更新:根据接受的答案,我们创建了一个新方法,返回布尔值,条件是valueB == null.
当我们使用Hibernate时,我们用@Transient带有Hibernate注释的boolean getter 注释valueB 并注释它@Column.
小智 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;
}
}
Run Code Online (Sandbox Code Playgroud)
还有一个虚拟对象供它序列化:
package com.example.xml.adaptor;
public class EmptyObject {
// EMPTY
}
Run Code Online (Sandbox Code Playgroud)
然后在您的对象中,使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
这应该<isPresent/>在true时生成元素,但在false时省略它.
| 归档时间: |
|
| 查看次数: |
5691 次 |
| 最近记录: |