//Mybatis-plus的配置类(略去无关代码)
@Configuration
public class MyBatisConfig {

    @Resource
    private DruidDataSource dataSource;
    @Bean
    public MybatisSqlSessionFactoryBean sqlSessionFactory(){
        MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setGlobalConfig(globalConfig());
        return sqlSessionFactoryBean;
    }
}

//Druid的配置类(略去无关代码)
@Configuration
public class DruidConfig {

    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;
    @Value("${jdbc.url}")
    private String url;

    @Bean
    public DruidDataSource dataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        //dataSource.setDriverClassName(driverClassName);//如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
    }
}

这种写法在启动时一直报错

Caused by: java.lang.IllegalArgumentException: Property 'dataSource' is required

分析报错日志,是在创建mapper的时候需要用到sqlSessionFactory,于是spring去创建sqlSessionFactory,创建时又依赖于DataSrouce,然后从spring容器中获取,而此时dataSource尚未创建,则获取的dataSource是null,在set之后就报错了。

于是尝试把2个配置类合并到一起,直接调用dataSource()方法来获取dataSource,则所有的Value属性都是null,此时创建DataSource就失败了。于是查找@Value注入失败的解决方案,也始终未找到解决办法。

把DruidDataSource放入@Bean注解的方法参数里,问题得以解决

@Configuration
public class MyBatisConfig {

    @Bean
    public MybatisSqlSessionFactoryBean sqlSessionFactory(DruidDataSource dataSource){
        MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setGlobalConfig(globalConfig());
        return sqlSessionFactoryBean;
    }
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐