【问题标题】:Returning JPA entities from Web Service methods using JAXB and Eclipselink Moxy使用 JAXB 和 Eclipselink Moxy 从 Web 服务方法返回 JPA 实体
【发布时间】:2012-12-05 14:36:10
【问题描述】:

我正在开发要部署在 WebSphere 应用程序服务器上的 Java EE 应用程序。在这个应用程序中,我有一个 Web 服务,我想通过它传输 JPA 实体对象作为方法调用的结果。问题来自于实体关系产生的循环。

我使用 Eclipselink Moxy 来解决 JPA 实体之间的反向引用问题。但是,由于我自己没有调用 JAXB 实现,而是 WAS 调用它自己的实现,所以 @XmlInverseReference 注释会被忽略。我不想使用 @XmlTransient 注释,因为获取所有引用的实体作为方法结果对我来说很重要。

是否可以使用 Moxy 作为默认的 WebSphere JAXB 实现?或者,我可以为我的实体创建 JAXB 适配器,然后在运行时添加 @XmlTransient 注释吗?我需要这个,因为我有方法返回引用其他实体的实体,但也返回引用的实体及其对数据库关系源的引用。

【问题讨论】:

    标签: web-services jakarta-ee jaxb websphere moxy


    【解决方案1】:

    注意:我是EclipseLink JAXB (MOXy) 的负责人,也是JAXB (JSR-222) 专家组的成员。

    在 JAX-WS 实现中没有要求它们能够交换替代的 JAXB 实现。在不支持 MOXy 作为 JAX-WS 中的 JAXB 提供程序的环境中,一种选择是使用标准的Provider 机制。

    您可以尝试替换 @XmlInverseReference 注释的一个技巧是利用解组事件回调机制。这涉及将以下方法放在子对象上。在该方法的实现中,您可以设置对父级的引用。

    void afterUnmarshal(Unmarshaller, Object parent);
    

    注意:您需要使用 @XmlTransient 注释该属性。

    MOXy 可在以下环境中用作 JAX-WS 的 JAXB 提供程序:

    【讨论】:

    • 非常感谢您的回答。实现 afterUnmarshal 方法的选项对我不起作用,因为我的编组需要双向工作,从父级到子级,反之亦然,这意味着我不能在任何地方使用 @XmlTransient。您能否提供更多关于如何在 WebSphere 中将 Moxy 安装为 JAXB 提供程序的信息?
    • @XmlInverseReference 注释中有错字 - 所以不接受少于 6 个字符的编辑:(
    • @JacekLaskowski - 感谢您指出错字,现已修正。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 2011-08-24
    相关资源
    最近更新 更多