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

为何无法注入java.util.Random实例?部署报错WELD-001408

为什么java.util.Random无法被CDI注入,而自定义类A可以?

这个问题核心在于CDI的自动bean发现规则,咱们来掰扯清楚:

  • CDI不会自动管理JRE核心类:CDI默认只会扫描并管理你自己写的应用类(比如你的类A)、或者符合条件的第三方库类,但Java SE核心包(java.util、java.lang这些)里的类不在CDI的自动管理范围内。这么设计是为了避免把JDK里成千上万个类都当作CDI bean来处理,毕竟绝大多数JDK类都不需要被容器托管。

  • 你的类A能正常注入的原因:自定义的类A属于你的应用代码,只要它满足CDI的基础要求(比如有默认无参构造器、没被@Vetoed标记),CDI就会自动把它识别为一个带@Default限定符的bean,自然能顺利注入。

  • 解决Random注入问题的方案:要让CDI能注入java.util.Random,你需要手动写一个生产者方法,告诉CDI怎么创建这个类的实例。举个例子:

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Produces;
import java.util.Random;

@ApplicationScoped
public class RandomProducer {

    // 生产者方法,提供Random实例
    @Produces
    @ApplicationScoped // 可以根据需求选作用域,比如@Dependent(每次注入都新建实例)
    public Random createRandom() {
        return new Random();
    }
}

写完这个生产者类后,CDI就知道该通过这个方法获取Random对象了,再注入就不会报WELD-001408的错误啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:28:17