我有一个这样的课:
@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();
}
}
当我注入对象时,无论我使用什么注释,它都会出错。一些错误:
怎么解决?
你可能与你的@Singleton @Startup bean有一个竞争条件和它依赖的东西。我自己已经多次见过这个了。特别是当@Startup bean依赖于容器必须初始化的另一个工具时(q.v. JPA,JMS,CDI等)。如果是这种情况,请删除@Startup,并在首次将bean注入依赖项时让bean初始化。
如果你真的,真的,真的需要将bean作为@Startup,尝试隔离它失败的依赖关系,并在@DependsOn(depends =“blah blah blah blah”)注释中标记该依赖关系。
我使用过的另一个解决方法,如果你不能删除@Startup,隔离依赖关系并通过JNDI(旧学校)延迟注入它。有时候,所有的花里胡哨都会妨碍“它是如何完成的”。 /微笑
让买家当心