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

WELD-001408:Tomcat部署时DataSource依赖注入失败求助

问题本质

你给TestDAO标记了@Named,导致WELD(CDI容器)会接管这个Bean的创建,但你在applicationContext.xml里定义的dataSource是Spring容器的私有Bean,CDI容器无法访问到这个Bean,因此触发了WELD-001408的依赖不满足错误。而JUnit测试用@SpringJUnitConfig启动的是Spring容器,所有Bean都在Spring上下文内,所以能正常注入。

解决方法

方法1:把TestDAO交给Spring容器管理(最简单)

把TestDAO上的@Named替换为Spring的@Component,构造方法的@Inject换成@Autowired,让Spring接管这个DAO的生命周期,自然能注入Spring定义的dataSource:

@Component
public class TestDAO extends JdbcDaoSupport implements ITestDAO {
    @Autowired
    public TestDAO(@Qualifier("dataSource") DataSource dataSource) {
        setDataSource(dataSource);
    }

    @Override
    public Map<String, Option> getLabelMap() {
        // 原有业务代码
        return map;
    }
}

注意:要确保TestDAO所在的包被Spring组件扫描覆盖;如果没配置组件扫描,需要在applicationContext.xml里手动注册这个Bean。

方法2:向CDI容器暴露Spring的dataSource

如果必须用CDI管理TestDAO,需要把Spring的dataSource暴露给CDI:

  1. 确保项目引入spring-context-support依赖(对应Spring 6.0的版本)
  2. 编写一个CDI生产者类,从Spring上下文获取dataSource并提供给CDI:
@Component
@Named
public class SpringBeanProducer {
    @Autowired
    private ApplicationContext applicationContext;

    @Produces
    @Named("dataSource")
    public DataSource produceDataSource() {
        return applicationContext.getBean("dataSource", DataSource.class);
    }
}

这个类需要同时被Spring和CDI扫描到:加@Component让Spring接管它,加@Named让CDI识别它,同时确保它在beans.xml指定的CDI扫描包范围内。

方法3:启用Spring CDI桥接

利用Spring提供的CDI桥接特性,让CDI直接访问Spring的Bean:

  1. 引入spring-cdi依赖(对应Spring 6.0的版本)
  2. 在WEB-INF/beans.xml中添加配置,启用Spring CDI桥接:
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd"
       version="2.0">
    <alternatives>
        <class>org.springframework.cdi.context.support.ApplicationContextBean</class>
    </alternatives>
</beans>

配置完成后,CDI就能直接识别并注入Spring中定义的@Named("dataSource")数据源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:05:36