4

我正在使用 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 的构建版本在上面的异常消息中指定。如果您需要更多信息,请与我们联系。

编辑2:

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

这是 Login 类的类定义:

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

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

    ...
}

编辑3:

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

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

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

4

1 回答 1

3

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

解决方案

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

  • org.eclipse.persistence.asm

结合已经使用的 EclipseLink 包:

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

原因

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

于 2013-09-20T13:59:45.380 回答