【问题标题】:Representing element as boolean with JAXB?用 JAXB 将元素表示为布尔值?
【发布时间】:2010-04-19 14:22:35
【问题描述】:

我们有这个 XML:

  <Summary>
     <ValueA>xxx</ValueA>
     <ValueB/>
  </Summary>

&lt;ValueB/&gt; 永远不会有任何属性或内部元素。它是一个布尔类型元素 - 它存在(真)或不存在(假)。

JAXB 生成了一个带有 String valueA 成员的 Summary 类,这很好。但是对于 ValueB,JAXB 生成了一个 ValueB 内部类和一个对应的成员:

@XmlElement(name = "ValueB")
protected Summary.ValueB valueB;

但我想要的是boolean 成员和no 内部类:

@XmlElement(name = "ValueB")
protected boolean valueB;

你怎么能做到这一点?

我不想重新生成类,我只想手动更改代码。


更新:根据接受的答案,我们创建了一个新方法,该方法返回布尔值,条件是 valueB == null。

当我们使用 Hibernate 时,我们使用 @Transient 注释 valueB 并使用 Hibernate 的 @Column 注释注释布尔 getter。

【问题讨论】:

  • 你真的需要一个布尔字段吗?为什么不只是布尔 getter/setter 方法?

标签: java jaxb


【解决方案1】:

使用 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;
    }
}

还有一个用于序列化的虚拟对象:

package com.example.xml.adaptor;

public class EmptyObject {
    // EMPTY
}

然后在您的对象中,使用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;
    }
}

这应该在 true 时产生 &lt;isPresent/&gt; 元素,但在 false 时省略它。

【讨论】:

  • 在类上注解@XmlAccessorType(XmlAccessType.NONE),则不需要@XmlTransient,只考虑显式注解的属性。
  • 还值得一提的是,getter 和 setter 应该将 Boolean 对象作为返回类型(对于 getter)和参数类型(对于 setter)...使用原始类型或两者都不适合我。
【解决方案2】:

jaxb 创建一个内部类,因为它认为这是一个复杂的属性,这很符合逻辑

除了将其更改为布尔值之外,您还可以检查null == valueB,如果您输入了

@XmlElement(name = "ValueB", nillable='true') protected Summary.ValueB valueB; 在你的逻辑。

或者添加一个没有@XMl....的额外getter并返回valueB的计算状态 也许你想要的可以通过 JAXB 实现,我以前不需要它。

【讨论】:

  • 是的,那行得通。宁愿没有内部类..会更简单。
猜你喜欢
  • 2011-06-11
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
  • 1970-01-01
相关资源
最近更新 更多