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>
了解更多信息


通过使用可为空的类型并向类注册JAXB侦听器来实现这一点。在JAXB侦听器中,如果不想封送属性,请将属性设置为
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;