2013-06-19 2 views
0

Я пытаюсь создать механизм стиля вставки, чтобы связать EE5 с другим фреймворком, который не поддерживает EJB-инъекцию. В настоящее время я использую пользовательский аннотацию и соглашение об именах для поиска EJB в JNDI:Поиск контейнера EJB для реализаций определенного интерфейса

@ContainerResource 
private LocalListener listener; 

@Initialize 
public void init(){ 
    new Injection<InjectionAction>().inject(this); 
} 

Класс впрыска:

public class Injection<T> { 

public void inject(T clazz) { 
    for(Field field : clazz.getClass().getDeclaredFields()){ 
     if(field.isAnnotationPresent(ContainerResource.class)){ 
      Object resource = findResource(field); 
      try { 
       field.setAccessible(true); 
       field.set(clazz, resource); 
      } catch (IllegalArgumentException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 


} 

private Object findResource(Field field) { 
    Object resource = null; 
    try { 
     InitialContext ic = new InitialContext(); 
     resource = ic.lookup(field.getType().getSimpleName()+ "Impl/local"); 

    } catch (NamingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return resource; 



} 

}

Я хотел бы найти более надежный метод, который не полагается на соглашение об именах, для поиска контейнера для EJB на основе его локального интерфейса.

+0

Я, скорее всего, собираюсь другой путь в моей работе. До этого решения одна из идей, о которых я думал, заключалась в создании своего рода агрегатора EJB для ввода всех возможных компонентов, к которым будет нужен доступный мне код. Затем обратитесь к EJB с JNDI и найдите его содержимое (псевдоконтент). Я включил этот комментарий в попытку предоставить любому, кто смотрит на этот вопрос, приемлемую альтернативу, но я не уверен, что он квалифицируется как ответ. – jake

ответ

1

Я не знаю, понимаю ли я вашу проблему, но если вы хотите найти объект в реестре JNDI, единственный способ - это его имя, поэтому вы должны знать имя или полагаться на него соглашение об именах.

EJB-инъекция внутренне реализована с использованием JNDI, а также полагается на соглашение об именах. Если вы используете аннотацию @EJB без параметров, контейнер будет искать объект, используя имя локального интерфейса, или явно вы можете указать имя используемого связывания с @EJB (name = "myBeanJNDIbindigName")

+0

Код, который я хочу «внедрить» с помощью EJB, развертывается в системе, которая не поддерживает EJB и не обрабатывает аннотации @EJB. Я не знал, что EJB полагается на соглашения об именах внутри, я должен изучить это. Я хотел сделать его основанным на типе. – jake