CDI从外面注入bean

时间:2014-08-20 12:56:36

标签: java-ee cdi

基本上,我的项目是一个战争(MyProject)并导入2个罐子,MyProject-Client和MyProjectJar-API

MyProject

pom.xml
<dependency>
   <groupId>com.sample</groupId>
   <artifactId>MyProject-Client</artifactId>
   <version>1.0-SNAPSHOT</version>
</dependency>

<dependency>
   <groupId>com.sample</groupId>
   <artifactId>MyProjectJar-API</artifactId>
   <version>1.0-SNAPSHOT</version>
</dependency>

@Named
@Stateless
public class ParametroServiceImpl implements ParametroService, Serializable {
}

MyProjectJar-API - 有一个界面

public interface ParametroService {}

MyProject-Client - 想要注入在MyProject上生成的ParametroService

@Named
@RequestScoped
public class RestEngine implements Serializable{
   @Inject
   private ParametroService parametroService;
}

我想知道是否可以在MyProject-Client中注入ParametroService(在MyProject上生成)(它是在MyProject上导入的jar)?

更新

如果我以这种方式注入它不起作用

@Inject
private ParametroService parametroService;

但是如果我以编程方式查找它有效,但我不知道为什么

BeanManager beanManager=(BeanManager)new InitialContext().lookup("java:comp/BeanManager");
Bean<?> bean = beanManager.getBeans(ParametroService.class).iterator().next();
parametroService = (ParametroService)beanManager.getReference(bean, ParametroService.class, beanManager.createCreationalContext(bean));

1 个答案:

答案 0 :(得分:1)

有两种可能的解决方案:使用bean archives@Producer方法。

要将MyProjectJar-API转换为bean存档,只需添加一个META-INF目录,其中包含beans.xml。如果您控制正在使用的jar,这是首选的解决方案。

如果您无法修改jar,您仍然可以创建一个@Producer方法,该方法可以创建对象的实例。 CDI将使用此方法来创建实例。

public class ParametroServiceProducer {
  @Produces
  public ParametroService createInstance() {
    return new ParametroServiceImpl();
  }
}