OpenLiberty下Java 8实现接口后@Singleton@Startup@Inject注入失败
问题原因及解决办法
原因
CDI容器默认会将接口类型作为Bean的公开类型。当类A实现接口B后,容器只会把B识别为该Bean的可注入类型,不会自动暴露类A本身。如果类C中仍以A作为注入类型,容器找不到匹配的Bean实例,就会抛出WELD-001408依赖不满足异常。未实现接口时,容器直接将类A作为公开类型,因此注入正常。
解决办法
方案1:改用接口类型注入
将类C中的注入点改为接口B的类型,容器会自动匹配实现该接口的Singleton Bean:
@ApplicationScoped public class C { @Inject private B b; // 注入接口类型 }
方案2:用@Typed指定Bean的公开类型
在类A上添加@Typed注解,明确告诉CDI容器需要暴露类A本身作为可注入类型:
@Singleton @Startup @Typed(A.class) // 若需要同时暴露接口B,可写为@Typed({A.class, B.class}) public class A implements B { // 业务代码 }
之后类C中@Inject private A a;的写法即可正常注入。
方案3:使用自定义限定符
- 定义一个限定符注解:
@Qualifier @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.TYPE}) public @interface MySingletonBean {}
- 在类A上标注该限定符:
@Singleton @Startup @MySingletonBean public class A implements B { // 业务代码 }
- 在类C的注入点添加限定符:
@ApplicationScoped public class C { @Inject @MySingletonBean private A a; // 通过限定符匹配Bean }
内容的提问来源于stack exchange,提问作者Pipo
相关产品推荐
相关产品推荐

