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

时间:2010-04-19 14:22:36

标签: java jaxb

我们有这个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成员和没有内部类:

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

你怎么能这样做?

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


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

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

2 个答案:

答案 0 :(得分:7)

使用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,则应生成<isPresent/>元素,但在false时将其省略。

答案 1 :(得分:1)

这是相当逻辑的jaxb创建了一个内部类,因为它认为这是一个commplexAttribute

如果你输入

,你也可以检查null == valueB,而不是将其更改为布尔值

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

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