本地EJB bean注入:注入的EJB bean中的目标EJB bean的未知InjectionPoint

时间:2014-08-19 18:24:42

标签: logging ejb-3.0 cdi

我有一个特殊要求:从注入的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;

  ...
}
  • CDI注射方法"知道" Bean1 InjectionPoint
  • Bean1"知道" Bean2 InjectionPoint - >不清楚如何解决

亲切的问候, 安德烈亚斯

1 个答案:

答案 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;

...
}