2016-05-16 10 views
2

Я не мог реализовать прокси-сервер BB внутри сервера Glassfish. Когда я пытаюсь использовать сгенерированный класс он бросает:Ошибка при реализации прокси-сервера Byte-Buddy в Glassfish eviroment

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

Исключение должно иметь причину прикрепленную к почему execition не удалось. Что указывает причина? –

+0

Говорят, что класс IObjectProxy не найден, но этот класс находится в пакете, который он ссылается. Может быть проблема с пакетом? Пакет OGM отличается от пакета приложений. –

+0

Я загрузил проект в Github для тех, кто хочет его проверить или использовать. URL-адрес https://github.com/mdre/odbogm –

ответ

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(); 
    

 Смежные вопросы

  • Нет связанных вопросов^_^