使用 JAXB 将元素表示为布尔值?

2024-04-01

我们有这个 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(使用前将#替换为@)

使用 JAXB 将元素表示为布尔值? 的相关文章

随机推荐