JAXB:当返回类型是接口时,如何使用字段名编组?

时间:2012-02-10 17:40:17

标签: java interface jaxb marshalling

如果我的类(A)包含多个相同类型的属性(接口B)。

我已经使用http://jaxb.java.net/guide/Mapping_interfaces.html中的建议来使用@XmlRootElement和@XmlAnyElement的组合来解决界面问题:

public interface B {...}

public class A {
...
  @XmlAnyElement
  public B getFirstB(){...}
  @XmlAnyElement
  public B getSecondB(){...}
}

// some concrete implementations of B
@XmlRootElement
public class BImpl implements B {...}

@XmlRootElement
public class AnotherBImpl implements B {...}

我得到以下内容:

<a>
    <bImpl/>
    <anotherBImpl/>
</a>

但我想区分属性。我怎么得到:

<a>
    <firstB>
        <bImpl/>
    </firstB>
    <secondB>
        <anotherBImpl/>
    </secondB>
</a>

由于属性不是集合,我不能使用@XmlElementWrapper。

如果可以避免,我真的不想更改代码。

任何想法都赞赏。在JAXB中编组似乎非常棘手。

3 个答案:

答案 0 :(得分:1)

@XmlAnyElement替换为@XmlElement(type = Object.class)。这将区分各个领域。

有关此解决方案的详细信息,请参阅my answer相关问题。

答案 1 :(得分:0)

您无法在JAXB中封送接口。 unmarshaller如何知道如何实例化你的界面? 检查this,它有一个非常好的解释。

答案 2 :(得分:0)

我认为,在你的情况下不会发生任何魔法。要么使用简单的包装类(对于经典的JAXB),要么使用@XmlPath(对于MOXy)(对 Blaise Doughan 的确认)。