我正在使用DynamicJAXBContextFactory.createContextFromXSD
方法从jaxbcontext
创建xsd
。
当我从junit测试中实例化所有类时它工作正常,但是当我调用在glassfish 4服务器上部署的相同类时,找不到类org.eclipse.persistence.jaxb.dynamic.metadata.SchemaMetadata
!
使用Eclipselink 2.5.0运行GlassFish Server开源版4.0(版本89)
我已经使用Eclipselink 2.5.1测试了夜间建造的glassfish-4.0.1-b04-02_04_2014-ml,这是同样的错误。
我下载了源代码,在调试期间,我可以将log.debugflag
设置为4,并详细说明原因:
java.lang.ClassNotFoundException:
***
未找到类'org.eclipse.persistence.jaxb.dynamic.metadata.SchemaMetadata',因为bundle org.eclipse.persistence.core [211]不导入'org .eclipse.persistence.jaxb.dynamic.metadata'即使bundle org.eclipse.persistence.moxy [216]确实导出它。此外,该类也可从系统类加载器中获得。有两个修复:1)将'org.eclipse.persistence.jaxb.dynamic.metadata'的导入添加到bundle org.eclipse.persistence.core [211];对于捆绑代码直接触及或间接触及的每个类,都需要导入,例如,如果使用其方法,则为超类。 2)将包'org.eclipse.persistence.jaxb.dynamic.metadata'添加到'org.osgi.framework.bootdelegation'属性;库或VM错误可能导致类被错误的类加载器加载。第一种方法更适用于保持模块性。***
我将org.eclipse.persistence.jaxb.dynamic.metadata
添加到org.osgi.framework.bootdelegation
媒体资源中。然后加载类,但现在找不到构造函数了!
我调试了org.eclipse.persistence.internal.security.PrivilegedAccessHelper.getConstructorFor
方法,(参见下面的代码),但即使它们看起来和我一样,它也找不到构造函数!
parameterType
是org.eclipse.persistence.dynamic.DynamicClassLoader
类,
argType
是班级org.eclipse.persistence.dynamic.DynamicClassLoader
,
但不知何故,如果代码在glassfish 4中运行,方法parameterType.isAssignableFrom(argType)) && (!argType.isAssignableFrom(parameterType)
会失败,但如果从junit-test运行则会有效。
我不知道为什么它不起作用,有人可以帮助我吗?
详细信息表明应该使用数字1)解决方案,即
1)将'org.eclipse.persistence.jaxb.dynamic.metadata'的导入添加到bundle org.eclipse.persistence.core [211];
这是eclipselink中的错误,如果有人可以修复它吗?
以下是该方法的代码:
public static Constructor getConstructorFor(final Class javaClass, final Class[] args, final boolean shouldSetAccessible) throws NoSuchMethodException {
Constructor result = null;
try {
result = javaClass.getConstructor(args);
} catch (NoSuchMethodException missing) {
// Search for any constructor with the same number of arguments and assignable types.
for (Constructor constructor : javaClass.getConstructors()) {
if (constructor.getParameterTypes().length == args.length) {
boolean found = true;
for (int index = 0; index < args.length; index++) {
Class parameterType = Helper.getObjectClass(constructor.getParameterTypes()[index]);
Class argType = Helper.getObjectClass(args[index]);
if ((!parameterType.isAssignableFrom(argType))
&& (!argType.isAssignableFrom(parameterType))) {
found = false;
break;
}
}
if (found) {
result = constructor;
break;
}
}
}
if (result == null) {
throw missing;
}
}
if (shouldSetAccessible) {
result.setAccessible(true);
}
return result;
}
答案 0 :(得分:0)
MOXy支持从XML Schema引导动态JAXB模型目前在OSGi环境中不起作用。
对于此功能,MOXy利用JAXB参考实现中的代码。部分代码,负责从XML Schema生成Java类。当我们尝试使用OSFi时,这段代码给我们带来了问题,因此我们无法通过OSGi公开依赖它的代码。