如何注入以@Startup注释的Singleton类? @ Inject,@ Resource,@ EJB或BeanManager?

时间:2018-08-24 14:50:37

标签: java-ee dependency-injection jax-rs cdi inject

我有一个这样的班级:

@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: 带有限定符@Default

  • 的类型A的依赖关系不令人满意

如何解决?

1 个答案:

答案 0 :(得分:1)

您的@Singleton @Startup bean和它所依赖的东西可能存在竞争状况。我本人已经看过几次了。尤其是@Startup bean依赖于容器必须初始化的另一种功能(q.v. JPA,JMS,CDI等)。如果是这种情况,请删除@Startup并在首次将其注入依赖项时让它进行初始化。

如果您确实确实需要将bean用作@Startup,请尝试隔离其失败的依赖项,并在@DependsOn(depends =“ blah blah blah”)批注中标记该依赖项。

我使用的另一种解决方法,如果无法删除@Startup,请隔离依赖项并通过JNDI(旧派)懒惰地注入它。有时,所有的风吹草动都妨碍了“它是如何完成的”。 / grin

腔体清空器