开发者社区> 问答> 正文

Multiple Spring Data modules found, ente?400报错

spring-boot 项目同时配置依赖spring-boot-starter-data-jpa和spring-boot-start-data-redis会出现如下信息:

2018-09-10 11:06:36.569 [INFO] - Multiple Spring Data modules found, entering strict repository configuration mode! 
2018-09-10 11:06:37.278 [INFO] - Multiple Spring Data modules found, entering strict repository configuration mode! 
2018-09-10 11:06:37.406 [INFO] - Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.mytest.test.repo.dao.UserRepo. 
2018-09-10 11:06:37.407 [INFO] - Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.mytest.test.repo.dao.CarRepo. 
2018-09-10 11:06:37.407 [INFO] - Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.mytest.tset.repo.dao.UserCarRepo. 

一般情况下对项目无影响,但有时候项目会无法启动获取很长时间才启动起来,但是项目不报错。
mysql,redis依赖如下:

... 
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
...

mysql,redis配置文件:

# mysql
spring.datasource.url=jdbc:mysql://localhost:3306/mytest?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
spring.datasource.username=root
spring.datasource.password=root123

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.hikari.connection-timeout=3000
spring.datasource.hikari.initialization-fail-fast=true
spring.datasource.hikari.max-lifetime=600000
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=20000
spring.datasource.hikari.idle-timeout=300000
spring.datasource.hikari.initialization=true


spring.jpa.database=mysql
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.transaction.rollback-on-commit-failure=true

# redis
spring.redis.database=0
spring.redis.host=localhost
spring.redis.password=redis
spring.redis.port=6379

spring.redis.pool.maxActive=8
spring.redis.pool.maxWait=-1
spring.redis.pool.maxIdle=8
spring.redis.pool.minIdle=0
spring.redis.timeout=2000

网上搜到一些方法但时并不管用,如:
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.multiple-modules
请问该如何解决???

展开
收起
爱吃鱼的程序员 2020-06-06 15:20:24 3073 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
                        <p>加上这个配置看看</p> 
    
    spring.data.redis.repositories.enabled=false
                            嗯,是的,加了这个配置后是可以的
                        
    
                        <p>你发的文档里已经说得很清楚了,即使给出答案(答案本来也就在你眼前),你都不能理解和接受。<br>
    

    做技术的还是要沉下心来好好读下文档,不要按自己已知的想法去理解问题,学习框架就要按框架里的思想去理解问题。
    否则没几个人有耐心这样去帮你解决问题。

    问题分析:

    项目引用了spring-boot-starter-data-jpa和Redis两种Repository的引用

    1. 这两种Repository的上层接口都一样,都是同一个包中的Repository, 都属于spring-data项目,spring-data分成了common,jpa,redis,mongodb...等模块
    2. 同时引用了这两个Spring boot的自动配置类后,项目启动时会扫描所有Repository的接口生成代理Bean(标记了@NoRepositoryBean的不生成)
    3. 你项目中的这些com.mytest.test.repo.dao.UserRepo, CarRepo, UserCarRepo 接口全部都会尝试生成两个代理Bean,一个是JPA的,一个是Redis的,这样也可能导入两个问题:

     

    • Jpa的Repository生成Redis的Repository代理实例警告,因为你的RedisRepository管理的对象是@Entity ,也没有@RedisHash等信息
    • 同时spring context中有两个同样类型的bean,Spring IoC默认是以类型注入的方式,依赖的注入结果不一定正确


    解决问题方案

    1, 需要使用两种不同类型的spring-data模块时,用Annotation指定Repository的扫描位置

    @EnableJpaRepositories(basePackages = "com.mytest.test.repo.dao")
    @EnableRedisRepositories(basePackages = "com.mytest.test.repo.redis", indexConfiguration = MyIndexConfiguration.class)

    即使你没有redis repository也需要这样做,因为这样做的目的不是让你扫描redis repository,而是让redis配置类不要去扫描其它类型的repository

    2,既然你没有使用redis repository的需求,那就不要启用RedisRepositories

    或者不要引用spring boot的redis starter
    你只是需要使用RedisTemplate,只引用spring-data-redis

    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-redis</artifactId>
    </dependency>

     

     

    基于你发的错误信息,基本断定是这个问题,如果真的不是这个问题,也欢迎指正。

                            3、关于第二种解决方案:spring-boot-starter-data-redis jar包是包含spring-data-redis这个jar包的,不同的是前者加入了netty连接池和spring-boot-starter.
                        
    
                            谢谢您的批评忠告。是我没把问题讲述清楚:
    

    1、如前面所示这个并不是一个错误信息【INFO】,正常情况下这样项目是没有问题的,spring-boot2.0后有些规则检查得更严格,可能会出现一些问题,就像是可能要很长时间项目才能情动起来。 2、关于第一种解决方案:即使加了这个注解后还是会有同样【INFO】。在这之前我已经尝试过文档中的方法,您给的建议我同样也做过了测试。

                        <p>这个问题就是你发的链接里的解决方法:</p> 
    

    将redis与jpa的repositories包分开,文档的例子是将mongo和jpa分开的例子

    @EnableJpaRepositories(basePackages = "com.acme.repositories.jpa")
    @EnableMongoRepositories(basePackages = "com.acme.repositories.mongo")
                            Jpa的可以,但是Redis只是用到了一些简单的String存储什么的,并没有定义特定的Repo,所以没有指定的包,这样并没有什么效果
                        
    
                        <p>我的项目里也是引用</p>
    
    spring-boot-starter-data-redis

    但是配置了不启用repository,如果改成启用也有这个info。

    2020-06-06 15:20:42
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载

相关实验场景

更多