如何注入一个用@Startup注释的Singleton类? @ Inject,@ Resource,@ EJB ou BeanManager?

问题描述 投票:1回答:1

我有一个这样的课:

@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:对于带有限定符@Afault的类型A的不满意依赖项

怎么解决?

java-ee dependency-injection jax-rs cdi inject
1个回答
1
投票

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

如果你真的,真的,真的需要将bean作为@Startup,尝试隔离它失败的依赖关系,并在@DependsOn(depends =“blah blah blah blah”)注释中标记该依赖关系。

我使用过的另一个解决方法,如果你不能删除@Startup,隔离依赖关系并通过JNDI(旧学校)延迟注入它。有时候,所有的花里胡哨都会妨碍“它是如何完成的”。 /微笑

让买家当心

© www.soinside.com 2019 - 2024. All rights reserved.