搜索EJB容器以获取特定接口的实现

时间:2013-06-19 20:27:40

标签: java java-ee ejb

我正在尝试创建一种注入风格机制,将EE5绑定到另一个不支持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。

1 个答案:

答案 0 :(得分:1)

我不知道我是否理解你的问题,但是如果你想在JNDI注册表中查找一个对象,唯一的方法就是他的名字,因此,你必须知道这个名字或依赖于名称惯例。

内部的EJB注入是使用JNDI实现的,并且还依赖于名称约定。 如果您使用没有参数的注释@EJB,容器将使用本地接口名称查找对象,或者显式地您可以使用@EJB指示使用的绑定名称(name =“myBeanJNDIbindigName”)