我无法在Glassfish服务器中实现BB代理。当我尝试使用生成的类时,它会抛出:
Grave: java.lang.IllegalStateException: Error invoking java.lang.ClassLoader#findClass
at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection$Dispatcher$Resolved.loadClass(ClassInjector.java:401)
at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection.inject(ClassInjector.java:210)
at net.bytebuddy.dynamic.loading.ClassLoadingStrategy$Default$InjectionDispatcher.load(ClassLoadingStrategy.java:204)
at net.bytebuddy.dynamic.loading.ClassLoadingStrategy$Default.load(ClassLoadingStrategy.java:119)
at net.bytebuddy.dynamic.DynamicType$Default$Unloaded.load(DynamicType.java:4350)
at ar.gov.santafe.mpa.odbogm.proxy.ObjectProxyFactory.create(ObjectProxyFactory.java:77)
以下是生成代理对象的方法类:
public static <T> T create(T o, OrientElement oe, SessionManager sm ) {
T po = null;
try {
ObjectProxy bbi = new ObjectProxy(o,oe,sm);
po = (T) new ByteBuddy()
.subclass(o.getClass())
.implement(IObjectProxy.class)
// .method(isDeclaredBy(IObjectProxy.class))
.method(any())
.intercept(MethodDelegation.to(bbi))
.make()
.load(o.getClass().getClassLoader(), ClassLoadingStrategy.Default.INJECTION)
.getLoaded().newInstance();
bbi.___setProxyObject(po);
} catch (InstantiationException ex) {
Logger.getLogger(ObjectProxyFactory.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(ObjectProxyFactory.class.getName()).log(Level.SEVERE, null, ex);
}
return po;
}
Here是完整的堆栈跟踪。
注意:代码工作正常,并在独立的jvm中传递所有测试。
这是Glassfish的类加载器!我无法从WEB-INF / lib加载该类。
答案 0 :(得分:0)
o.getClass()
的类加载器无法看到IObjectProxy
,您遇到的错误类似于调用:
Class.forName(IObjectProxy.class.getName(),
false,
o.getClass().getClassLoader());
您的Glassfish设置似乎无法实现的功能。你有不同的解决方案:
IObjectProxy
对o.getClass().getClassLoader()
可见。IObjectProxy.class.getClassLoader()
是o.getClass().getClassLoader()
的孩子,请改用此类加载器。定义MultipleParentClassLoader
(Byte Buddy的一部分),它是两个类加载器的子级,用于加载已检测的类。您可以致电:
new MultipleParentClassLoader.Builder()
.append(IObjectProxy.class, o.getClass())
.build();