首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >局部EJB注入:注入EJB中目标EJB的未知InjectionPoint

局部EJB注入:注入EJB中目标EJB的未知InjectionPoint
EN

Stack Overflow用户
提问于 2014-08-19 18:24:41
回答 1查看 183关注 0票数 1

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

代码语言:javascript
复制
@Stateless
public class Bean1 implements Bean1_LocalInt {

  @Inject
  private Logger log;
  ...
}

Bean 2:

代码语言:javascript
复制
@Stateless
public class Bean2 implements Bean2_LocalInt {    

  @EJB 
  private Bean1_LocalInt bean1;

  ...
}
  • CDI注入法“知道”Bean1 InjectionPoint
  • Bean1“知道”Bean2 InjectionPoint ->不清楚如何解决

你好,安德烈亚斯

EN

回答 1

Stack Overflow用户

发布于 2014-08-22 17:02:19

我通过使用CDI和生产者模式找到了一个解决方案。无论何时注入服务SLSB,都会设置记录器。

如果在另一个目标bean中使用SLSB,而EJB容器重用已经创建的实例的同一个实例,那么是否会重复注入并再次传递producer方法?

代码语言:javascript
复制
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:

代码语言:javascript
复制
@Local 
public interface LocalServiceInterface {
  public String getInfo();
  public void setLogger(Logger log);
}

EJB:

代码语言:javascript
复制
@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注入类:

代码语言:javascript
复制
@Stateless
public class MemberRegistration {

    @Inject @LocalService1
    private LocalServiceInterface localService;

...
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25390429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档