将以前的WebSphere Java EE应用程序移动到JBOSS EAP 6.3时,当调用Castor 1.0 org.exolab.castor.xml的Marshall(对象)方法时,会抛出运行时异常。卫士对象:
org.exolab.castor.mapping.MappingException: Nested error: org.exolab.castor.mapping.MappingException: Could not find the class
{fully qualified Java class name}
(骑兵正在尝试将一个对象序列化为XML。)
我没有看到明显的班级问题。似乎没有理由为什么使用JBOSS开发人员工作室罚款的该应用程序会在运行时失败。
问题发生在mapping.xml文件中描述的第一个Java类时 - 不是在我试图序列化的类中,除非巧合恰好是映射.xml文件中的第一类。<<<<<<<<<<
可能是什么问题,什么是解决方案?
在搜寻Google后,我在2002年的讨论线程中找到了解决方案:
https://developer.jboss.org/thread/21611
在该讨论线程中的每个Fred Loney:
jboss lib castor.jar位于classloader中,该classloader是您的WebApp classloader的父母。Castor依赖于内省和尝试使用其ClassLoader上下文而不是WebApp或线程上下文来解决映射类的尝试。因此,找不到映射的应用程序类。...Castor默认情况下应使用当前的线程上下文classloader,但事实并非如此。这是依赖内省的其他开源中间件项目的失败,例如仙人掌。
按照该线程中建议的建议,我将代码更改为,而不是使用org.exolab.castor.mapping.mapping的默认构造函数,而是使用接受classloader参数的构造函数,我使用了classloader我要序列化的对象类别。
Object objectToSerialize = ...
// I previously used Mapping's default constructor
Mapping mapping = new Mapping(objectToSerialize.getClass().getClassLoader());
// Set other properties of mapping, such as entityResolver, mapping file, etc.
StringWriter stringWriter = new StringWriter();
Marshaller marshaller = new Marshaller(stringWriter);
marshaller.setMapping(mapping);
marshaller.marshal(objectToSerialize);
// stringWriter now contains the serialized data from objectToSerialize
我希望弗雷德·洛尼(Fred Loney)的技巧对某人有帮助。我花了一段时间才找到问题和解决方案在线!