使用MOXY的JAXB实现,使用基于注释+动态映射

时间:2013-09-18 15:35:30

标签: java xml jaxb marshalling moxy

我正在使用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);

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

THX

编辑:

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

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

以下是与User类不同的包中的HistorizedObject类定义:

    @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类上的注释相同,因此这个类的源代码中的一些东西显然引发了Exception。 问题是这个类是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;

    ...
}

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实施的错误还是我错过了什么?

1 个答案:

答案 0 :(得分:2)

注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。

<强>解决方案

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

  • org.eclipse.persistence.asm

结合已经使用的EclipseLink捆绑包:

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

<强>原因

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