【发布时间】:2018-08-24 14:50:37
【问题描述】:
我有这样的课程:
@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 的不满足依赖项
如何解决?
【问题讨论】:
-
如果您使用
@Inject(我建议),那么bean 的发现取决于您何时拥有beans.xml以及您拥有的bean 发现模式。如果设置错误,您最终会得到您所看到的 -WELD-001408: Unsatisfied dependencies...。简而言之,这意味着没有找到带有限定符@Default的此类 beanA。尝试将空的beans.xml添加到您的应用程序中,并将您的Abean 标记为@ApplicationScoped(保留它@Singleton和@Startup)。拥有@Default限定符是多余的,您可以将其删除(默认情况下假定)。
标签: jakarta-ee dependency-injection jax-rs cdi inject