DynamicJAXBContextFactory.createContextFromXSD无法加载SchemaMetadata

时间:2014-02-09 12:33:43

标签: java jaxb moxy

我正在使用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方法,(参见下面的代码),但即使它们看起来和我一样,它也找不到构造函数! parameterTypeorg.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;
}

1 个答案:

答案 0 :(得分:0)

MOXy支持从XML Schema引导动态JAXB模型目前在OSGi环境中不起作用。

对于此功能,MOXy利用JAXB参考实现中的代码。部分代码,负责从XML Schema生成Java类。当我们尝试使用OSFi时,这段代码给我们带来了问题,因此我们无法通过OSGi公开依赖它的代码。