org.springframework.beans.factory.BeanCreationException: Error creating bean with name

方便更快捷的说明问题,可以按需填写(可删除)

使用环境:

sharding 5.1.1
mybatis-plus 多数据源 3.5.1

场景、问题:

出现异常

已进行操作:

spring:
  # 基于mybatis-plus的多数据源
  datasource:
    dynamic:
      datasource:
        # 数仓数据源
        datawarehouse:
          type: com.alibaba.druid.pool.DruidDataSource
          driver-class-name: com.mysql.jdbc.Driver
          url: jdbc:mysql://localhost:3306/maxrocky?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
          username: root
          password: root
        # 添加其他数据源
      #        test:
      #          type: com.alibaba.druid.pool.DruidDataSource
      #          driver-class-name: com.mysql.jdbc.Driver
      #          url: jdbc:mysql://localhost:3306/zt_test?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
      #          username: root
      #          password: 123456

      # 指定默认数据源名称 此处指定 shardingSphere 为默认数据源。
      primary: shardingSphere
  # 基于 sharding sphere 进行分表
  shardingsphere:
    mode:
      type: Standalone
      repository:
        type: File
      overwrite: true
    datasource:
      # 连接名称(下面要用这个名称来区分库)
      names: ds0
      ds0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/shard_one?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
        username: root
        password: root
    #      ds1:
    #        type: com.alibaba.druid.pool.DruidDataSource
    #        driver-class-name: com.mysql.jdbc.Driver
    #        url: jdbc:mysql://localhost:3306/shard_two?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    #        username: root
    #        password: root
    #      ds2:
    #        type: com.alibaba.druid.pool.DruidDataSource
    #        driver-class-name: com.mysql.jdbc.Driver
    #        url: jdbc:mysql://localhost:3306/shard_three?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    #        username: root
    #        password: root
    # 是否开启 SQL 显示,默认值: false
    props:
      sql-show: true
    # 数据分片策略
    rules:
      sharding:
        # 未配置分片规则的表将通过默认数据源定位
        default-data-source-name: ds0
        # 按表来区分
        tables:
          # 表名
          sys_user:
            # 配置数据节点 由数据源名 + 表名组成,以小数点分隔。多个表以逗号分隔,支持 inline 表达式。
            # 缺省表示使用已知数据源与逻辑表名称生成数据节点,
            # 用于广播表(即每个库中都需要一个同样的表用于关联查询,多为字典表)或只分库不分表且所有库的表结构完全一致的情况
            #            actual-data-nodes: ds$->{0..2}.sys_user_$->{0..2}
            actual-data-nodes: ds0.sys_user_$->{0..2}
              # 分库策略
            #            databaseStrategy:
            # 分库的规则 用id这个字段来分库 总共有三个库 ds0(sys_user)与ds1(sys_user)
            #                shardingColumn: id
            #                algorithmExpression: ds${id % 3}
            # 分表策略
            table-strategy:
              standard:
                sharding-column: id
                sharding-algorithm-name: sys-user-inline
            key-generate-strategy:
              column: id
              key-generator-name: snowflake
        sharding-algorithms:
          database-inline:
            type: INLINE
            props:
              #              algorithm-expression: ds$->{id % 3}
              algorithm-expression: ds0
              allow-range-query-with-inline-sharding: true
          sys-user-inline:
            type: INLINE
            props:
              # 分片算法行表达式,需符合groovy语法 '& Integer.MAX_VALUE' 位运算使hash值为正数
              algorithm-expression: sys_user_$->{id % 3}
        default-database-strategy:
          standard:
            sharding-column: id
            sharding-algorithm-name: database-inline
        # 分布式序列算法配置
        key-generators:
          # 分布式序列列名称
          snowflake:
            # 分布式序列算法类型
            type: SNOWFLAKE
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: none
#=================================上传文件大小限制(-1无限制默认4M)=====================================
  servlet:
    multipart:
      max-file-size: -1
      max-request-size: -1
#=================================其他基础配置========================================================
#Redis配置
  redis:
    host: 127.0.0.1
    port: 6379
    #password: 7QuyQX8Xq6rY15Zr
    lettuce:
      pool:
        #连接池中的最大空闲连接
        max-idle: 50
        #连接池中的最小空闲连接
        min-idle: 10
        #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: 10s
        #连接池最大连接数(使用负值表示没有限制)
        max-active: 100
#日志级别设置DEBUG INFO WARN ERROR
log:
  level: INFO
#jasypt加密秘钥(生产推荐加至启动参数中)
jasypt:
  encryptor:
    password: 123456
#xss配置(若开启xss默认会将特殊符号全部进行转义,请根据项目实际情况进行过滤范围及白名单配置)
xss:
  #开关 true/false
  enabled: false
  #白名单接口,即不需要过滤的地址,逗号分隔,例如/cornerstones/*,/base/*
  excludes: /demo
  #过滤范围 /* 为全过滤 多个例如/const/*,/caa/*
  urlPatterns: /*

现状:

[2022-05-16 17:47:38.390 maxrocky-cloud-service-transfer INFO  ,, main org.apache.catalina.core.StandardService Stopping service [Tomcat]
[2022-05-16 17:47:38.420 maxrocky-cloud-service-transfer ERROR ,, main org.springframework.boot.SpringApplication Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSourceConfiguration': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'shardingSphereDataSource' defined in class path resource [org/apache/shardingsphere/spring/boot/ShardingSphereAutoConfiguration.class]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker': Invocation of init method failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [com/maxrocky/common/config/DataSourceConfiguration.class]: Invocation of init method failed; nested exception is java.lang.NullPointerException
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessProperties(CommonAnnotationBeanPostProcessor.java:324)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1411)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:843)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)
	at com.maxrocky.MaxrockyCloudServiceTransferApplication.main(MaxrockyCloudServiceTransferApplication.java:17)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'shardingSphereDataSource' defined in class path resource [org/apache/shardingsphere/spring/boot/ShardingSphereAutoConfiguration.class]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker': Invocation of init method failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [com/maxrocky/common/config/DataSourceConfiguration.class]: Invocation of init method failed; nested exception is java.lang.NullPointerException
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:204)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeanByName(AbstractAutowireCapableBeanFactory.java:452)
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:526)
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:496)
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:636)
	at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:180)
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90)
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessProperties(CommonAnnotationBeanPostProcessor.java:321)
	... 17 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker': Invocation of init method failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [com/maxrocky/common/config/DataSourceConfiguration.class]: Invocation of init method failed; nested exception is java.lang.NullPointerException
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1778)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:224)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1116)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:409)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:343)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:337)
	at org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerPostProcessor.postProcessAfterInitialization(DataSourceInitializerPostProcessor.java:55)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:429)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1782)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593)
	... 29 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [com/maxrocky/common/config/DataSourceConfiguration.class]: Invocation of init method failed; nested exception is java.lang.NullPointerException
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1778)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
	at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1248)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory$DependencyObjectProvider.getIfUnique(DefaultListableBeanFactory.java:1902)
	at org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker.getDataSourceInitializer(DataSourceInitializerInvoker.java:100)
	at org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker.afterPropertiesSet(DataSourceInitializerInvoker.java:62)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1837)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1774)
	... 43 common frames omitted
Caused by: java.lang.NullPointerException: null
	at java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1011)
	at java.util.concurrent.ConcurrentHashMap.put(ConcurrentHashMap.java:1006)
	at com.baomidou.dynamic.datasource.DynamicRoutingDataSource.addDataSource(DynamicRoutingDataSource.java:141)
	at com.baomidou.dynamic.datasource.DynamicRoutingDataSource.afterPropertiesSet(DynamicRoutingDataSource.java:222)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1837)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1774)
	... 56 common frames omitted

没有见过这个异常,好奇问一下,为什么要用这种方式来实现多数据源,仅用 ShardingSphere 无法实现吗?

没有提供足够的信息,看起来你缺失对数据源托管的配置,参考 dynamic-datasource-samples/third-part-samples/shardingSphere-jdbc-sample at master · dynamic-datasource/dynamic-datasource-samples · GitHub

整合sharding的时候,停止程序报错,和#395差不多 · Issue #415 · baomidou/dynamic-datasource-spring-boot-starter · GitHub 重复。

This problem does not exist in SpringBoot 2.5.1-3.0.0-M2, and there is no way to feed back to the Spring community for problems with specific releases that have been discontinued from the community.

找到问题了。因为 springboot 版本太低原因导致,spring boot 2.5.x亲测可以整合shardingsphere5.x版本。但是 spring boot 2.1.x 只能整合 shardingsphere4.x 版本

1 个赞
京ICP备2021015875号