Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required (java17,springboot3,shardingsphere5.20,mybatis3.5.2) #28294

Closed
StupidManYI opened this issue Aug 28, 2023 · 4 comments

Comments

@StupidManYI
Copy link

StupidManYI commented Aug 28, 2023

Bug Report

Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
at org.springframework.util.Assert.notNull(Assert.java:204) ~[spring-core-6.0.11.jar:6.0.11]
at org.mybatis.spring.support.SqlSessionDaoSupport.checkDaoConfig(SqlSessionDaoSupport.java:122) ~[mybatis-spring-2.0.7.jar:2.0.7]
at org.mybatis.spring.mapper.MapperFactoryBean.checkDaoConfig(MapperFactoryBean.java:73) ~[mybatis-spring-2.0.7.jar:2.0.7]
at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44) ~[spring-tx-6.0.11.jar:6.0.11]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1817) ~[spring-beans-6.0.11.jar:6.0.11]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1766) ~[spring-beans-6.0.11.jar:6.0.11]
... 58 common frames omitted

Which version of ShardingSphere did you use?

`
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-core-api</artifactId>
    <version>5.2.0</version>
</dependency>
<dependency>
      <groupId>org.apache.shardingsphere</groupId>
      <artifactId>sharding-core-api</artifactId>
      <version>4.1.1</version>
  </dependency>

`
java17 
springboot3  
mybatisplus3.5.2
druid-spring-boot-starter-1.2.8

Which project did you use? ShardingSphere-JDBC or ShardingSphere-Proxy?

ShardingSphere-JDBC

Expected behavior

Normal add data

Actual behavior

springboot lunch error

Reason analyze (If you can)

Steps to reproduce the behavior, such as: SQL to execute, sharding rule configuration, when exception occur etc.

Example codes for reproduce this issue (such as a github link).

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.ingsha</groupId>
    <artifactId>intellij_study_platform</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>
    <modules>
        <module>user-interface</module>
        <module>application</module>
        <module>domain</module>
        <module>event</module>
        <module>infrastructure</module>
        <module>application-layer</module>
        <module>common</module>
    </modules>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!--spring && springboot -->
        <spring-boot.version>3.1.2</spring-boot.version>
        <!-- db -->
        <druid.version>1.2.8</druid.version>
        <mysql.version>8.0.17</mysql.version>
        <shardingsphere.version>5.2.0</shardingsphere.version>
        <sharding-core-api.version>4.1.1</sharding-core-api.version>
        <mybatis-plus.version>3.5.2</mybatis-plus.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.apache.shardingsphere</groupId>
                <artifactId>sharding-core-api</artifactId>
                <version>${sharding-core-api.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatis-plus.version}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>${druid.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.shardingsphere</groupId>
                <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
                <version>${shardingsphere.version}</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${druid.version}</version>
            </dependency>
            
   
        </dependencies>
    </dependencyManagement> 
</project>

application.yml

...
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

spring:
  shardingsphere:
    mode:
      type: Memory
    datasource:
      names: ds0
      ds0:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://xxx:3306/oauth_role?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&useTimezone=true&tinyInt1isBit=false
        username: root
        password: "root"
        min-idle: 2
        initial-size: 1
        max-total: 5
        max-wait-millis: 200
        connectProperties: { connectionInitSqls: SET NAMES utf8mb4 }
    #        connectionInitSqls: SET NAMES utf8mb4  #让 druid 支持特殊字符 加上shardingsphere会报错
    rules:
      defaultDatabaseStrategy:
        inline:
          sharding-column: id
          algorithm-expression: ds0
      defaultKeyGenerateStrategy:
        type: MyShardingKeyGenerator
        column: id
#      tables:
#        sys_user:
#          actual-data-nodes: ds0.sys_user_$->{0..1}
#          key-generator:
#            column: id
#            type: MyShardingKeyGenerator
#          table-strategy:
#            inline:
#              sharding-column: id
#              algorithm-expression: sys_user_$->{id % 2}
#        sys_user_role:
#          actual-data-nodes: ds0.sys_user_role_$->{0..1}
#          key-generator:
#            column: user_id
#            type: MyShardingKeyGenerator
#          table-strategy:
#            inline:
#              sharding-column: user_id
#              algorithm-expression: sys_user_role_$->{user_id % 2}
#        user_oss_record:
#          actual-data-nodes: ds0.user_oss_record_$->{0..1}
#          key-generator:
#            column: user_id
#            type: MyShardingKeyGenerator
#          table-strategy:
#            inline:
#              sharding-column: user_id
#              algorithm-expression: user_oss_record_$->{user_id % 2}
#        user_info:
#          actual-data-nodes: ds0.user_info_$->{0..1}
#          key-generator:
#            column: user_id
#            type: MyShardingKeyGenerator
#          table-strategy:
#            inline:
#              sharding-column: user_id
#              algorithm-expression: user_info_$->{user_id % 2}

#      default-table-strategy:
#        inline:
#          sharding-column: id
#          algorithm-expression: ds0

mybatisplusConfig.class

@Configuration

public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

    /**
     * 分页插件
     *
     * @return
     */
    @Bean
    public PaginationInnerInterceptor paginationInnerInterceptor() {
        return new PaginationInnerInterceptor();
    }


    /**
     * 乐观锁插件
     *
     * @return
     */
    @Bean
    public OptimisticLockerInnerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInnerInterceptor();
    }


    //    /**
    //     * sql执行效率插件
    //     * @return
    //     */
    //    @Bean
    //    public PerformanceInterceptor performanceInterceptor() {
    //        return new PerformanceInterceptor();
    //    }

//    @Qualifier("ds0")
//    private DataSource dataSource;
//
//    @Bean(name = "sqlSessionFactoryBean")
//    public SqlSessionFactoryBean sqlSessionFactoryBean() {
//        SqlSessionFactoryBean sqlSessionFactoryBean = null;
//        try {
//            // 加载JNDI配置
//            Context context = new InitialContext();
//            // 实例SessionFactory
//            sqlSessionFactoryBean = new SqlSessionFactoryBean();
//            // 配置数据源
//            sqlSessionFactoryBean.setDataSource(dataSource);
//            // 加载MyBatis配置文件
//            PathMatchingResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
//            // 能加载多个,所以可以配置通配符(如:classpath*:mapper/**/*.xml)
////            sqlSessionFactoryBean.setMapperLocations(resourcePatternResolver.getResources
////                    ("classpath*:mapper/*.xml"));
//            // 配置mybatis的config文件(我目前用不上)
//            // sqlSessionFactoryBean.setConfigLocation("mybatis-config.xml");
//        } catch (Exception e) {
//            System.out.println("创建SqlSession连接工厂错误:{}");
//        }
//        return sqlSessionFactoryBean;
//    }
//
//    @Bean
//    public SqlSessionTemplate sqlSessionTemplate() throws Exception {
//        SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactoryBean().getObject(),
//                ExecutorType.BATCH);
//        return sqlSessionTemplate;
//    }

}
@linghengqian
Copy link
Member

@StupidManYI
Copy link
Author

StupidManYI commented Aug 29, 2023

https://github.com/StupidManYI/issues_demo
A very small project,after modifying the database configuration (in application.yml), you could test it

@linghengqian
Copy link
Member

  • @StupidManYI I processed your Example in linghengqian-scratches/issues_demo@9f93053 and I didn't see this Error Log.
  • You wrote IdGenerator.java completely wrong, and algorithm classes should never be put into a Spring Bean Container. Assignment to the algorithm's property field should be implemented through init() method, and if you need to change this value, you should recreate the instance of this algorithm class in ContextManager. And the algorithm class normally be an immutable final class.
  • You don't give a SQL file for table oauth_user, so I have to deal with the startup process simply.
  • README.md logs the Error Log emitted by Alibaba Druid itself, which I don't think is related to ShardingSphere because this Error Log doesn't exist when HikariCP is used.
  • 5.2.1 is the only version of org.apache.shardingsphere:shardingsphere-jdbc-core-spring-boot-starter that supports Spring Boot OSS 3, which has been deprecated in Removing Spring configuration from ShardingSphere #22469 . I think you should use the ShardingSphere JDBC Driver.
  • I don't understand why you changed the unix permissions for ./mvnw, which makes it unusable as it can't be used directly. It looks like your Maven Wrapper file was copied directly from another file system.
$ java --version
openjdk 17.0.8 2023-07-18
OpenJDK Runtime Environment GraalVM CE 17.0.8+7.1 (build 17.0.8+7-jvmci-23.0-b15)
OpenJDK 64-Bit Server VM GraalVM CE 17.0.8+7.1 (build 17.0.8+7-jvmci-23.0-b15, mixed mode, sharing)

$ mvn spring-boot:run
[INFO] Scanning for projects...
[INFO] 
[INFO] --------------------------< com.ingsha:demo >---------------------------
[INFO] Building demo 0.0.1-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] >>> spring-boot:3.1.3:run (default-cli) > test-compile @ demo >>>
[INFO] 
[INFO] --- resources:3.3.1:resources (default-resources) @ demo ---
[INFO] Copying 1 resource from src/main/resources to target/classes
[INFO] Copying 3 resources from src/main/resources to target/classes
[INFO] 
[INFO] --- compiler:3.11.0:compile (default-compile) @ demo ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- resources:3.3.1:testResources (default-testResources) @ demo ---
[INFO] skip non existing resourceDirectory /home/linghengqian/TwinklingLiftWorks/git/public/issues_demo/src/test/resources
[INFO] 
[INFO] --- compiler:3.11.0:testCompile (default-testCompile) @ demo ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] <<< spring-boot:3.1.3:run (default-cli) < test-compile @ demo <<<
[INFO] 
[INFO] 
[INFO] --- spring-boot:3.1.3:run (default-cli) @ demo ---
[INFO] Attaching agents: []

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.1.3)

2023-08-29T04:58:36.296+08:00  INFO 7130 --- [           main] com.ingsha.application.app.Application   : Starting Application using Java 17.0.8 with PID 7130 (/home/linghengqian/TwinklingLiftWorks/git/public/issues_demo/target/classes started by linghengqian in /home/linghengqian/TwinklingLiftWorks/git/public/issues_demo)
2023-08-29T04:58:36.300+08:00  INFO 7130 --- [           main] com.ingsha.application.app.Application   : No active profile set, falling back to 1 default profile: "default"
2023-08-29T04:58:37.459+08:00  INFO 7130 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'stringToNoneShardingStrategyConfigurationConverter' of type [org.apache.shardingsphere.spring.boot.converter.StringToNoneShardingStrategyConfigurationConverter] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-08-29T04:58:37.465+08:00  INFO 7130 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'spring.shardingsphere-org.apache.shardingsphere.spring.boot.prop.SpringBootPropertiesConfiguration' of type [org.apache.shardingsphere.spring.boot.prop.SpringBootPropertiesConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-08-29T04:58:37.902+08:00  INFO 7130 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.apache.shardingsphere.spring.boot.ShardingSphereAutoConfiguration' of type [org.apache.shardingsphere.spring.boot.ShardingSphereAutoConfiguration$$SpringCGLIB$$0] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-08-29T04:58:38.129+08:00  INFO 7130 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2023-08-29T04:58:38.139+08:00  INFO 7130 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2023-08-29T04:58:38.139+08:00  INFO 7130 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.12]
2023-08-29T04:58:38.235+08:00  INFO 7130 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2023-08-29T04:58:38.236+08:00  INFO 7130 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1706 ms
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
2023-08-29T04:58:38.415+08:00  INFO 7130 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2023-08-29T04:58:38.641+08:00  INFO 7130 --- [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:config user=SA
2023-08-29T04:58:38.643+08:00  INFO 7130 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2023-08-29T04:58:38.843+08:00 ERROR 7130 --- [           main] com.alibaba.druid.pool.DruidDataSource   : testWhileIdle is true, validationQuery not set
2023-08-29T04:58:38.876+08:00  INFO 7130 --- [           main] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} inited
Registered plugin: 'com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor@38c761e9'
Parsed mapper file: 'file [/home/linghengqian/TwinklingLiftWorks/git/public/issues_demo/target/classes/mapper/OauthUserPoMapper.xml]'
Initialization Sequence datacenterId:1 workerId:8
 _ _   |_  _ _|_. ___ _ |    _ 
| | |\/|_)(_| | |_\  |_)||_|_\ 
     /               |         
                        3.5.3.2 
2023-08-29T04:58:39.619+08:00  INFO 7130 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2023-08-29T04:58:39.631+08:00  INFO 7130 --- [           main] com.ingsha.application.app.Application   : Started Application in 3.705 seconds (process running for 4.034)

@StupidManYI
Copy link
Author

I modified the project as you showed , It works , thanks !!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants