我有一个特殊的需求:从注入EJB bean的角度查找注入目标EJB bean。
我已经看到了CDIs InjectionPoint的概念,对于本地EJB注入,我需要相同或类似的机制。
http://docs.oracle.com/javaee/6/api/javax/enterprise/inject/spi/InjectionPoint.html
动机: 应该在@Produces方法中确定“最终目的地”的类,以设置准确的记录器类别名称。
EAR应用程序的模块化日志概念(由模块化服务器结构组成)可以以这种方式实现。
我不知道如何从发生本地EJB bean的EJB容器中获取一些元信息。某种类型的侦听器或事件可能会有所帮助,或者拦截器或装饰器是否是要找到的正确路径?还是从堆栈跟踪中得到一些信息?
在一个EAR部署中有两个带有本地接口的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;
...
}你好,安德烈亚斯
发布于 2014-08-22 17:02:19
我通过使用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;
...
}https://stackoverflow.com/questions/25390429
复制相似问题