我有一个特殊要求:从注入的EJB bean的角度找出注入目标EJB bean。
我已经看到了CDI注入点的概念,我需要相同或类似的机制来进行本地EJB注入。
http://docs.oracle.com/javaee/6/api/javax/enterprise/inject/spi/InjectionPoint.html
动机:
"最终目的地的等级"应该确定 @Produces CDI方法设置准确的记录器类别名称。
EAR应用程序的模块化日志记录概念由模块化服务器结构组成,可以通过这种方式实现。
我不知道如何从EJB容器中获取一些元信息,无论何时发生本地EJB bean都会被注入。某种倾听者或事件可能会有所帮助,或者拦截器或装饰者是否正确找到正确的路径?或者我是否从堆栈跟踪中获取了一些信息?
在一个EAR部署中有2个具有本地接口的bean。
Bean 1:
@Stateless
public class Bean1 implements Bean1_LocalInt {
@Inject
private Logger log;
...
}
Bean 2:
@Stateless
public class Bean2 implements Bean2_LocalInt {
@EJB
private Bean1_LocalInt bean1;
...
}
亲切的问候, 安德烈亚斯
答案 0 :(得分:1)
我通过使用CDI和生产者模式找到了解决方案。只要注入服务SLSB,就会设置记录器。
如果在另一个目标bean中使用SLSB并且EJB容器重用已经创建的实例的相同实例,那么是否会重复注入并再次传递producer方法?
public class Resources {
@Inject
@LocalService1
private LocalServiceInterface localService;
@Produces
@LocalService1
public LocalServiceInterface getLocalSTBServiceA(InjectionPoint injectionPoint) {
try {
localEJBBean.setLogger(Logger.getLogger(injectionPoint.getBean().getBeanClass().getName()));
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}
return localEJBBean;
}
}
LocalServiceInterface:
@Local
public interface LocalServiceInterface {
public String getInfo();
public void setLogger(Logger log);
}
EJB:
@Stateless
public class LocalSTBServiceA implements LocalServiceInterface {
private Logger log = Logger.getLogger(LocalSTBServiceA.class.getName());;
public String getInfo() {
log.info("test info for logger category test in LocalSTBServiceA.getInfo()");
return "Hello Info!";
}
@Override
public void setLogger(Logger log) {
this.log = log;
}
}
目标EJB注入类:
@Stateless
public class MemberRegistration {
@Inject @LocalService1
private LocalServiceInterface localService;
...
}