gpt4 book ai didi

java - 使用基于注解的 MOXY 的 JAXB 实现 + 动态映射

转载 作者:数据小太阳 更新时间:2023-10-29 02:35:48 31 4
gpt4 key购买 nike

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

这是与 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 构建版本在上面的异常消息中指定。如果您需要更多信息,请告诉我。

编辑2:

当我指定类 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;

...
}

编辑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 中的对象可能未解析并发生冲突,但此 HashMap 未注释且不应编码,对吗?这是 MOXY 实现中的错误还是我错过了什么?

最佳答案

注意:我是 EclipseLink JAXB (MOXy) JAXB (JSR-222) 的领导和成员专家组。

解决方案

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

  • org.eclipse.persistence.asm

结合已经在使用的 EclipseLink 包:

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

原因

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

关于java - 使用基于注解的 MOXY 的 JAXB 实现 + 动态映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18876550/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com