我有一个这样的班级:
@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
如何解决?
答案 0 :(得分:1)
您的@Singleton @Startup bean和它所依赖的东西可能存在竞争状况。我本人已经看过几次了。尤其是@Startup bean依赖于容器必须初始化的另一种功能(q.v. JPA,JMS,CDI等)。如果是这种情况,请删除@Startup并在首次将其注入依赖项时让它进行初始化。
如果您确实确实需要将bean用作@Startup,请尝试隔离其失败的依赖项,并在@DependsOn(depends =“ blah blah blah”)批注中标记该依赖项。
我使用的另一种解决方法,如果无法删除@Startup,请隔离依赖项并通过JNDI(旧派)懒惰地注入它。有时,所有的风吹草动都妨碍了“它是如何完成的”。 / grin
腔体清空器