从Spring Boot版本2.1.16升级到2.2.0后,Spring Data JPA不注册存储库

如何解决从Spring Boot版本2.1.16升级到2.2.0后,Spring Data JPA不注册存储库

我们在Spring Boot,JPA和Data Rest中使用多租户。我们有一个包含租户实体的Admin数据源。位于Admin数据源中的Tenant实体包含租户及其关联的数据源(MySql中的方案)之间的映射。当我们使用Spring Boot 2.1.6时,该应用程序运行良好。但是在我们迁移到Spring Boot 2.2.0之后,它崩溃了。

问题的表现:

GET请求http:// localhost:31337 / admin / tenants?size = 10&page = 0曾经返回200 OK,但现在它返回404 Not-Found。

在使用Spring Boot 2.1.16运行我们的应用程序时,我们经常看到以下调试日志,但是在Spring Boot 2.2.0中不再看到该日志。

[main] .s.d.r.c.RepositoryConfigurationDelegate:Spring Data JPA-注册存储库:tenantRepository-接口:

这是我们的Spring Boot应用程序类:

package com.compx.depx.appx.service.admin;

@SpringBootApplication
@ComponentScan({"com.compx.depx.appx.service.admin","com.compx.depx.appx.service.common.admin","com.compx.depx.appx.service.common.jpa"})
@EnableResourceServer 
@EnableJpaRepositories(basePackages = "com.compx.depx.appx.service.admin.controller",entityManagerFactoryRef = "adminEntityManagerFactory",transactionManagerRef = "adminTransactionManager")
public class AdminServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(AdminServiceApplication.class,args);
    }
}

在Spring Boot应用程序的子包中,我们定义了Tenant REST存储库,如下所示:

package com.compx.depx.appx.service.admin.controller;
import com.compx.depx.appx.data.entity.admin.Tenant;

@RepositoryRestResource
public interface TenantRestResource extends PagingAndSortingRepository<Tenant,Integer> {
    Page<Tenant> findAllByTenantIdContainingIgnoreCase(@Param("tenantId") String tenantId,Pageable pageable);
    Page<Tenant> findAllByNameContainingIgnoreCase(@Param("name") String name,Pageable pageable);
}

我们已经在一个单独的Java包中定义了Tenant实体,如下所示:

package com.compx.depx.appx.data.entity.admin;

@Entity
@Data
public class Tenant {
    @Id
    @GeneratedValue
    private Integer id;

    private String schemaName;

    @Column(unique = true)
    @NotNull
    private String name;

    @Column
    private String tenantId;
}

我们还有一个用于JPA交易的Tenant存储库界面,如下所示:

package com.compx.depx.appx.data.repository.admin;

@Transactional("admin")
public interface TenantRepository extends Repository<Tenant,Integer> {

    Optional<Tenant> findByTenantId(String tenantId);
    Optional<Tenant> findById(Integer id);
}

我们已经定义了一个提供程序,它为我们提供了Admin DataSource的EntityManagerFactoryBean和TransactionManager,如下所示:

package com.compx.depx.appx.service.common.admin;
@Configuration
@RequiredArgsConstructor
@EntityScan(basePackages = "com.compx.depx.appx.data.entity.admin")
@EnableJpaRepositories(basePackages = {
                "com.compx.depx.appx.data.repository.admin" },transactionManagerRef = "adminTransactionManager")
public class AdminProvider {

    private final DataSourceProperties dataSourceProperties;

    @Bean
    @Primary
    @Qualifier("admin")
    public DataSource adminDataSource() {
        return dataSourceProperties.initializeDataSourceBuilder().build();
    }

    @Primary
    @Bean
    public LocalContainerEntityManagerFactoryBean adminEntityManagerFactory(EntityManagerFactoryBuilder builder,List<HibernatePropertiesCustomizer> hibernatePropertiesCustomizers) {
        Map<String,Object> props = new HashMap<>();
        for (HibernatePropertiesCustomizer customizer : hibernatePropertiesCustomizers) {
            customizer.customize(props);
        }
        return builder.dataSource(adminDataSource()).packages("com.compx.depx.appx.data.entity.admin").persistenceUnit("admin").properties(props).build();
    }
    @Bean
    @Qualifier("admin")
    public PlatformTransactionManager adminTransactionManager(EntityManagerFactoryBuilder builder,List<HibernatePropertiesCustomizer> hibernatePropertiesCustomizers) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(adminEntityManagerFactory(builder,hibernatePropertiesCustomizers).getObject());
        return transactionManager;
    }
}

我们还使用一个类为MySql ... etc自定义Hibernate属性。

package com.compx.depx.appx.service.common.jpa;
@Configuration
@RequiredArgsConstructor
@EnableJpaAuditing
public class JpaConfiguration {
    private final JpaProperties properties;
    private final HibernateProperties hibernateProperties;

    @Bean
    public Validator validator() {
        return new LocalValidatorFactoryBean();
    }

    @Bean
    public HibernatePropertiesCustomizer hibernateCustomizer() {
        return (props) -> {
                    properties.getProperties(),new HibernateSettings());
            props.putAll(newProps);
            props.put(AvailableSettings.JPA_VALIDATION_FACTORY,validator());
            if (!props.containsKey(AvailableSettings.DIALECT)) {
                String dialect = properties.getDatabasePlatform();
                if (dialect == null) {
                    dialect = "org.hibernate.dialect.MySQL57Dialect";
                }
                props.put(AvailableSettings.DIALECT,dialect);
            }
            if (properties.isGenerateDdl()) {
                props.put(AvailableSettings.HBM2DDL_AUTO,"update");
            }
            props.put(AvailableSettings.PHYSICAL_NAMING_STRATEGY,"org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy");
        };
    }
}

使用Spring 5.0.10和Spring Boot 2.0.6的工作应用程序中的调试日志

2020-08-23 23:09:10.889调试20 --- [main] .s.d.r.c.RepositoryConfigurationDelegate:扫描包com.compx.depx.appx.data.repository.admin中的存储库。 2020-08-23 23:09:10.910调试20 --- [main] osdrcRepositoryComponentProvider:标识的候选组件类:URL [jar:file:/appx/app.jar!/ BOOT-INF / lib / appx-reporting- data-2018.1-SNAPSHOT.jar!/com/compx/depx/appx/data/repository/admin/TenantRepository.class] 2020-08-23 23:09:11.028调试20 --- [main] .sdrcRepositoryConfigurationDelegate:Spring Data JPA-注册存储库:tenantRepository-接口:com.compx.depx.appx.data.repository.admin.TenantRepository-工厂:org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean 2020-08-23 23:09:11.029调试20 --- [main] .s.d.r.c.RepositoryConfigurationDelegate:完成存储库扫描。 2020-08-23 23:09:11.032调试20 --- [main] .s.d.r.c.RepositoryConfigurationDelegate:扫描com.compx.depx.appx.appx.service.admin.controller软件包中的存储库。 2020-08-23 23:09:11.036调试20 --- [main] osdrcRepositoryComponentProvider:识别出的候选组件类:URL [jar:file:/appx/app.jar!/ BOOT-INF / classes!/ com / compx /depx/appx/service/admin/controller/TenantRestResource.class] 2020-08-23 23:09:11.057调试20 --- [main] .sdrcRepositoryConfigurationDelegate:Spring Data JPA-注册存储库:tenantRestResource-接口:com.compx.depx.appx.service.admin.controller.TenantRestResource-工厂:org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean 2020-08-23 23:09:11.058调试20 --- [main] .s.d.r.c.RepositoryConfigurationDelegate:完成存储库扫描。

2020-08-23 23:10:17.401调试20 --- [nio-8080-exec-1] o.j.s.OpenEntityManagerInViewInterceptor:在OpenEntityManagerInViewInterceptor中打开JPA EntityManager 2020-08-23 23:10:17.404调试20 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet:空ModelAndView返回到名称为'dispatcherServlet'的DispatcherServlet:假设HandlerAdapter完成了请求处理 2020-08-23 23:10:17.404调试20 --- [nio-8080-exec-1] o.j.s.OpenEntityManagerInViewInterceptor:在OpenEntityManagerInViewInterceptor中关闭JPA EntityManager 2020-08-23 23:10:17.405调试20 --- [nio-8080-exec-1] o.s.orm.jpa.EntityManagerFactoryUtils:关闭JPA EntityManager 2020-08-23 23:10:17.405调试20 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet:成功完成请求

使用Spring 5.2.8和Spring Boot 2.3.3从损坏的应用程序中调试日志

2020-08-19 17:25:59.220信息20 --- [main] .s.d.r.c.RepositoryConfigurationDelegate:以DEFAULT模式引导Spring Data JPA存储库。 2020-08-19 17:25:59.246调试20 --- [main] .s.d.r.c.RepositoryConfigurationDelegate:扫描com.compx.depx.appx.datax.repository.admin包中的JPA存储库。 2020-08-19 17:25:59.262调试20 --- [main] osdrcRepositoryComponentProvider:确定的候选组件类:URL [jar:file:/appx/app.jar!/ BOOT-INF / lib / appx-reporting- data-2018.1-SNAPSHOT.jar!/com/compx/depx/appx/data/repository/admin/TenantRepository.class] 2020-08-19 17:25:59.404信息20-[[main] .s.d.r.c.RepositoryConfigurationDelegate:在157毫秒内完成Spring Data信息库扫描。找到1个JPA存储库接口。 2020-08-19 17:25:59.409信息20-[[main] .s.d.r.c.RepositoryConfigurationDelegate:在默认模式下引导Spring Data JPA存储库。 2020-08-19 17:25:59.409调试20 --- [main] .s.d.r.c.RepositoryConfigurationDelegate:扫描com.compx.depx.appx.appx.service.admin.controller包中的JPA存储库。 2020-08-19 17:25:59.414调试20 --- [main] osdrcRepositoryComponentProvider:标识的候选组件类:URL [jar:file:/appx/app.jar!/ BOOT-INF / classes!/ com / compx /depx/appx/service/admin/controller/TenantRestResource.class] 2020-08-19 17:25:59.454信息20-[[main] .s.d.r.c.RepositoryConfigurationDelegate:在45毫秒内完成Spring Data信息库扫描。找到1个JPA存储库接口。

2020-08-19 17:32:37.512调试20 --- [nio-8080-exec-7] o.s.security.web.FilterChainProxy:/ tenants?size = 10&page = 0到达附加过滤器链的末尾;继续原始链 2020-08-19 17:32:37.513调试20 --- [nio-8080-exec-7] o.s.web.servlet.DispatcherServlet:GET“ / tenants?size = 10&page = 0”,参数= {masked} 2020-08-19 17:32:37.516调试20 --- [nio-8080-exec-7] oswshandler.SimpleUrlHandlerMapping:映射到ResourceHttpRequestHandler [“ classpath:/ META-INF / resources /”,“ classpath:/ resources /“,” classpath:/ static /“,” classpath:/ public /“,” /“] 2020-08-19 17:32:37.517调试20 --- [nio-8080-exec-7] o.j.s.OpenEntityManagerInViewInterceptor:在OpenEntityManagerInViewInterceptor中打开JPA EntityManager 2020-08-19 17:32:37.520调试20 --- [nio-8080-exec-7] o.s.w.s.r.ResourceHttpRequestHandler:找不到资源 2020-08-19 17:32:37.521调试20 --- [nio-8080-exec-7] o.j.s.OpenEntityManagerInViewInterceptor:在OpenEntityManagerInViewInterceptor中关闭JPA EntityManager 2020-08-19 17:32:37.521调试20 --- [nio-8080-exec-7] o.s.web.servlet.DispatcherServlet:已完成404 NOT_FOUND

值得注意的区别是在工作版本上发生但在非工作版本中缺少的“ RepositoryConfigurationDelegate:Spring Data JPA-注册存储库:”日志。

我们已经尽可能检查了引入的库及其依赖项。我们感谢任何提示或指示可能导致此问题的原因。如果需要更多信息,请告诉我。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-