You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:使用自定义限定符

  1. 定义一个限定符注解:
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE})
public @interface MySingletonBean {}
  1. 在类A上标注该限定符:
@Singleton
@Startup
@MySingletonBean
public class A implements B {
    // 业务代码
}
  1. 在类C的注入点添加限定符:
@ApplicationScoped
public class C {
    @Inject
    @MySingletonBean
    private A a; // 通过限定符匹配Bean
}

内容的提问来源于stack exchange,提问作者Pipo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 18:42:09