Java JAXB-如果为false,则抑制布尔属性
假设我有一门课Java JAXB-如果为false,则抑制布尔属性,java,xml,jaxb,marshalling,Java,Xml,Jaxb,Marshalling,假设我有一门课 @XmlRootElement(name="thing") public class Thing{ private String name; private boolean awesome; @XmlValue public void setName(String name) { this.name = name; } public String getName() { return this.value;
@XmlRootElement(name="thing")
public class Thing{
private String name;
private boolean awesome;
@XmlValue public void setName(String name) {
this.name = name;
}
public String getName() {
return this.value;
}
@XmlAttribute public void setAwesome(boolean awesome) {
this.awesome = awesome;
}
public boolean isAwesome() {
return this.awesome;
}
}
如果我创建一些东西,然后将它们整理成XML,它看起来是这样的:
飞行忍者:
<thing awesome="true">flying ninja</thing>
飞行忍者
一个普通的旧爆米花球:
<thing awesome="false">popcorn ball</thing>
爆米花球
但是。。。我想做的是更改布尔属性的封送方式。我宁愿看到爆米花球像这样,超越了可怕的属性:
<thing>popcorn ball</thing>
爆米花球
我该怎么做
非常感谢 我对JAXB还不熟悉,但一般来说,使用或转换这种东西应该是非常可行的
此外,这个问题的答案还提到使用XmlAdapter,它看起来直接适用于您的问题:注意:我是负责人,也是JAXB 2.X()专家组的成员 使用MOXy,您可以按照建议执行
XmlAdapter
方法。它看起来像:
布尔适配器
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class BooleanAdapter extends XmlAdapter<Boolean, Boolean> {
@Override
public Boolean unmarshal(Boolean v) throws Exception {
return Boolean.TRUE.equals(v);
}
@Override
public Boolean marshal(Boolean v) throws Exception {
if(v) {
return v;
}
return null;
}
}
演示
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Thing.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
Thing thing = new Thing();
thing.setName("popcorn ball");
thing.setAwesome(false);
marshaller.marshal(thing, System.out);
thing.setAwesome(true);
marshaller.marshal(thing, System.out);
}
}
输出
<?xml version="1.0" encoding="UTF-8"?>
<thing>popcorn ball</thing>
<?xml version="1.0" encoding="UTF-8"?>
<thing awesome="true">popcorn ball</thing>
了解更多信息
null
。这种方法应该适用于任何JAXB实现
您的(布尔或其他)属性
JAXB-beforemashall处理程序
例如,这种方法可以产生以下结果。请注意,属性valueUnknown仅在未给定值属性时才存在
<items>
<item xsi:type="eduDataExchange:compoundValue" valueUnknown="true"/>
<item xsi:type="eduDataExchange:compoundValue" value="4" percentage="3"/>
</items>
用布尔对象替换布尔值,为我解决了这个问题 使用:-
private Boolean awesome;
而不是:-
private boolean awesome;
遗憾的是,这在国际扶轮是行不通的。但你的回答非常彻底,让我找到了一个合适的解决方案。谢谢。如果您将方法签名稍微更改为使用
Boolean
而不是Boolean
,它在JAXB RI中确实有效。至少对于有成就的人来说,这种方法对我有效。我没有像你的例子中那样用setter测试过它。是的,但这很糟糕,因为我不希望“null”成为代码中其他任何地方的选项。
@SuppressWarnings("PMD")
private void beforeMarshal(final Marshaller marshaller) {
// Remove the "valueUnknown" attribute if it is not true.
// Assigning a null value implies that the attribute is removed.
if(!valueUnknown) {
valueUnknown = null;
}
}
<items>
<item xsi:type="eduDataExchange:compoundValue" valueUnknown="true"/>
<item xsi:type="eduDataExchange:compoundValue" value="4" percentage="3"/>
</items>
private Boolean awesome;
private boolean awesome;