我正在尝试创建一种注入风格机制,将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。
答案 0 :(得分:1)
我不知道我是否理解你的问题,但是如果你想在JNDI注册表中查找一个对象,唯一的方法就是他的名字,因此,你必须知道这个名字或依赖于名称惯例。
内部的EJB注入是使用JNDI实现的,并且还依赖于名称约定。 如果您使用没有参数的注释@EJB,容器将使用本地接口名称查找对象,或者显式地您可以使用@EJB指示使用的绑定名称(name =“myBeanJNDIbindigName”)