2

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;
}

完全なスタック トレースは次のとおりです

注: コードは正常に動作し、スタンドアロン jvm ですべてのテストに合格します。


Glassfish のクラスローダです。WEB-INF/lib からクラスをロードできませんでした。

4

1 に答える 1

0

のクラス ローダーがo.getClass()見えませんIObjectProxy。発生するエラーは次の呼び出しに似ています。

Class.forName(IObjectProxy.class.getName(), 
              false,
              o.getClass().getClassLoader());

Glassfish のセットアップでは不可能と思われること。さまざまな解決策があります:

  1. そのようにプロジェクトを構成することで、それIObjectProxyが表示されることを確認してください。o.getClass().getClassLoader()
  2. IObjectProxy.class.getClassLoader()が の子である場合は、o.getClass().getClassLoader()代わりにこのクラス ローダーを使用します。
  3. MultipleParentClassLoader両方のクラス ローダーの子である (Byte Buddy の一部) を定義して、インストルメント化されたクラスをロードします。これを行うには、次のように呼び出します。

    new MultipleParentClassLoader.Builder()
        .append(IObjectProxy.class, o.getClass())
        .build();
    
于 2016-05-30T15:37:18.800 に答える