java-将JAXB编组为复杂类型的布尔值

我是JAXB的新手,我想做一些我不知道它是否可行的事情.我有一个像这样编组的Java类:

@XmlAccessorType(XMLAccessType.NONE)
public class MyClass {
  @XmlElement
  private String a = "x";
  @XmlElement
  private String b = "xx";
  @XmlElement
  private boolean c = true;
  ...
}

并希望这样的XML输出:

<?xml ...?>
<MyClass>
    <a>x</a>
    <b>xx</b>
    <c value="true"/>
</MyClass>

我想到的一种解决方案是使用布尔包装器类使其工作,但我想避免这种情况,因为这使我无法使用布尔原语true,false.

我们可以在JAXB中做到吗?

解决方法:

利用XmlAdapter

您可以创建XmlAdapter来获取所需的行为. XmlAdapter将域对象转换为另一种类型,以进行编组和解组.

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class BooleanAdapter extends XmlAdapter<BooleanAdapter.AdaptedBoolean, Boolean> {

    public static class AdaptedBoolean {

        @XmlAttribute
        public boolean value;

    }

    @Override
    public Boolean unmarshal(AdaptedBoolean adaptedBoolean) throws Exception {
        return adaptedBoolean.value;
    }

    @Override
    public AdaptedBoolean marshal(Boolean v) throws Exception {
        AdaptedBoolean adaptedBoolean = new AdaptedBoolean();
        adaptedBoolean.value = v;
        return adaptedBoolean;
    }

}

使用XmlAdapter

要使用XmlAdapter,您的映射字段将需要为Boolean类型而不是boolean类型.如果需要,访问器方法仍然可以是布尔值.

import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlAccessorType(XmlAccessType.NONE)
public class MyClass {
    @XmlElement
    private String a = "x";
    @XmlElement
    private String b = "xx";

    @XmlElement
    @XmlJavaTypeAdapter(BooleanAdapter.class)
    private Boolean c = true;

    public boolean getC() {
        return c;
    }

    public void setC(boolean c) {
        this.c = c;
    }
}
上一篇:java-当有静态类时,没有带有@XmlElementDecl的ObjectFactory


下一篇:C CLI结构到字节数组