【问题标题】:Using MOXY's JAXB Implementation using annotations based + on the fly mapping使用 MOXY 的 JAXB 实现,使用基于注释的 + 动态映射
【发布时间】:2013-09-18 15:35:29
【问题描述】:

我正在使用 RESTEasy 库编写一个 RESTful WS 应用程序。 我一直在寻找一种动态修改某些模型/xml 映射的方法,并找到了 MOXY 的 JAXB 实现。

问题是当我使用文件 jaxb.properties 指定 MOXY 的实现时,当我尝试检索 JAXBContext 时,出现以下异常:

javax.xml.bind.JAXBException: 
Exception Description: Name collision.  Two classes have the XML type with uri http://www.w3.org/2001/XMLSchema and name anyType.
 - with linked exception:
[Exception [EclipseLink-50007] (Eclipse Persistence Services - 2.6.0.v20130912-6b5e067): org.eclipse.persistence.exceptions.JAXBException

使用 RESTEasy JAXB 不会引发此类异常。 我试图删除所有 @XMLElement 以避免引用一些未知类,但没有任何效果。 这是类定义:

@XmlRootElement(name = "user")
@XmlAccessorType(XmlAccessType.NONE)
public class User extends HistorizedObject implements java.io.Serializable
{
    @XmlElement(name="refNumber")
    private String m_ref;

    ...
}

以及我尝试检索 JAXBContext 的方式:

JAXBContext jaxbContext = JAXBContext.newInstance(User.class);

没有关于哪些类发生冲突的线索。 你有什么想法吗?

谢谢

编辑:

这是我的 jaxb.properties 文件,它与 User 类位于同一包中:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

这是 HistorizedObject 类定义,它位于与 User 类不同的包中:

    @XmlAccessorType(XmlAccessType.NONE)
    public abstract class HistorizedObject implements PersistentObject, Cloneable{

        @XmlElement(name="userCreate")
        protected String userCreate="";

        @XmlElement(name="userUpdate")
        protected String userUpdate; 

        ...
}

我的应用程序使用 RestEasy 2.3.5 在 JBoss 4.2.3GA 下运行。 我使用的 moxy 的构建版本在上面的异常消息中指定。 如果您需要更多信息,请告诉我。

EDIT2:

当我指定类 Login(与 User 位于同一包中)时检索 JAXBContext 工作正常。 Login 类的注解和 User 类的注解是一样的,所以很明显这个类的源代码中有些东西是在引发异常。 问题是这个类有3000行长...... 你知道我应该从哪里开始寻找什么吗?

这里是登录类的类定义:

@XmlRootElement(name = "login")
@XmlAccessorType(XmlAccessType.NONE)
public class Login extends HistorizedObject implements java.io.Serializable
{

    /** Email address */
    @XmlElement(name="emailAddress")
    private String m_email;

    ...
}

EDIT3:

好的,我发现了一些有趣的东西。 这是导致名称冲突的 User 类中的代码:

public static final HashMap<String, Object[]> USERTYPEOFELEM;
    static
    {
        USERTYPEOFELEM = new HashMap<String, Object[]>();
        USERTYPEOFELEM.put("GENDER", new Object[]{Constants.IMPORT_LISTOFVALUE, "gender"});
        ...
    }

我了解此 HashMap 中的对象可能无法解析并发生冲突,但此 hashmap 没有注释,不应该被编组,对吗? 这是 MOXY 实现的错误还是我错过了什么?

【问题讨论】:

  • 您能否发布更多信息。在这一点上,我不确定如何重新创建您所看到的问题。
  • @BlaiseDoughan 发布了更多信息
  • @BlaiseDoughan 我可能在 MOXY 的 JAXB 实现中发现了一个错误。你能确认一下吗?
  • 这里可能有错误。我仍在尝试根据您提供的信息重新创建用例。您能否打开一个错误并附加一个测试用例:bugs.eclipse.org/bugs/enter_bug.cgi?product=EclipseLink。或者您可以通过我的博客与我进行电子邮件对话:blog.bdoughan.com/p/contact_01.html

标签: java xml jaxb marshalling moxy


【解决方案1】:

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

解决方案

根据离线对话的结果,该问题的解决方案是使用以下 EclipseLink 包:

  • org.eclipse.persistence.asm

结合已经使用的 EclipseLink 包:

  • org.eclipse.persistence.core
  • org.eclipse.persistence.moxy

原因

在为Map 对象创建映射时,MOXy 字节码会生成一些对象(利用 ASM)。如果没有这些生成的类,MOXy 的元数据生成就会失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多