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

发布于 2025-01-04 01:32:13 字数 987 浏览 1 评论 0原文

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

我已经使用了 http://jaxb.java.net/guide/Mapping_interfaces.html< 中的建议/a> 使用 @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 中的编组似乎非常棘手。

If I have a class (A) that contains several properties of the same type (interface B).

I've used the suggestion in http://jaxb.java.net/guide/Mapping_interfaces.html to use a combination of @XmlRootElement and @XmlAnyElement to get around the interface problem:

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 {...}

I get the following:

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

But I want to distinguish between the properties. How do I get:

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

As the properties are not collections, I can't use @XmlElementWrapper.

I don't really want to change the code if avoidable.

Any thoughts appreciated. Marshalling in JAXB seems to be very tricky.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

甜宝宝 2025-01-11 01:32:13

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

有关此解决方案的更多详细信息,请参阅我对相关问题的回答

Replace @XmlAnyElement with @XmlElement(type = Object.class). This will distinguish individual fields.

More details on this solution in my answer to a related question.

-小熊_ 2025-01-11 01:32:13

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

You cannot marshal interfaces in JAXB. How would the unmarshaller know how to instantiate your interface?
Check this out, it has a really nice explanation.

蓝海似她心 2025-01-11 01:32:13

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

I think, no magic can happen in your case. Either use a simple wrapper class (for classic JAXB) or use @XmlPath (for MOXy) (acknowledgements to Blaise Doughan).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文