如何注入一个用@Startup注释的单例类? @Inject、@Resource@EJB ou BeanManager?



我有这样的类:

@Singleton
@Startup
@Default
public class A {
private Manager manager; // Manager is an interface
@PostConstruct
public void init() {
if (some rule is true) {
manager = new ManagerA();
} else {
manager = new ManagerB();
}
}
public Manager getManager() {
return manager;
}
}

现在我有一个端点 JAX-RS,如下所示:

@Path("mypath")
public class B {
// @Inject vs @Resource vs @EJB - my doubt
private A objA;
@POST
@Path("resource")
@Consumes("application/json")
@Produces("application/json")
public Response myMethod(String param) {
objA.getMamager().executeSomeMethod(param);
return Response.status(HttpStatus.SC_OK).build();
}
}

当我去注入对象时,无论我使用什么注释,它都会出错。一些错误:

  • WFLYWELD0044:将资源注入 CDI 管理的 Bean 时出错。不能 查找名为

  • 无法启动服务 原因如下: org.jboss.weld.exceptions.DeploymentException: WELD-001408: 具有限定符的 A 类型@Default的未满足依赖项

如何解决?

你可能与你的@Singleton @Startup豆和它所依赖的东西有竞争条件。 我自己也见过好几次。 特别是当@Startup bean 依赖于容器必须初始化的另一个工具(q.v. JPA、JMS、CDI 等(时。 如果是这种情况,请删除@Startup,让 Bean 在首次注入依赖项时进行初始化。

如果你真的,真的,真的需要@Startup Bean,请尝试隔离它失败的依赖项,并在 @DependsOn(depends="blah blah blah"( 注释中标记该依赖项。

我使用过的另一个解决方法是,如果您无法删除@Startup,请隔离依赖项并通过 JNDI(老派(懒惰地注入它。 有时,所有的花里胡哨的东西都会妨碍"它是如何真正完成的"。/笑容

警告 emptor

最新更新