From a52ab774de244f94f415475f2896920ab9241706 Mon Sep 17 00:00:00 2001 From: Yanming Zhou Date: Fri, 1 Mar 2024 15:12:23 +0800 Subject: [PATCH] Configure JpaBaseConfiguration with custom ManagedClassNameFilter Update `JpaBaseConfiguration` to configure a `ManagedClassNameFilter` if one is available. See gh-39813 --- .../orm/jpa/JpaBaseConfiguration.java | 10 +++++++--- .../AbstractJpaAutoConfigurationTests.java | 20 ++++++++++++++++++- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/JpaBaseConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/JpaBaseConfiguration.java index 90355acc669..4117f01555c 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/JpaBaseConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/JpaBaseConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -46,6 +46,7 @@ import org.springframework.core.io.ResourceLoader; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.JpaVendorAdapter; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.persistenceunit.ManagedClassNameFilter; import org.springframework.orm.jpa.persistenceunit.PersistenceManagedTypes; import org.springframework.orm.jpa.persistenceunit.PersistenceManagedTypesScanner; import org.springframework.orm.jpa.persistenceunit.PersistenceUnitManager; @@ -69,6 +70,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; * @author Andy Wilkinson * @author Kazuki Shimizu * @author EddĂș MelĂ©ndez + * @author Yanming Zhou * @since 1.0.0 */ @Configuration(proxyBeanMethods = false) @@ -195,9 +197,11 @@ public abstract class JpaBaseConfiguration { @Bean @Primary @ConditionalOnMissingBean - static PersistenceManagedTypes persistenceManagedTypes(BeanFactory beanFactory, ResourceLoader resourceLoader) { + static PersistenceManagedTypes persistenceManagedTypes(BeanFactory beanFactory, ResourceLoader resourceLoader, + ObjectProvider managedClassNameFilter) { String[] packagesToScan = getPackagesToScan(beanFactory); - return new PersistenceManagedTypesScanner(resourceLoader).scan(packagesToScan); + return new PersistenceManagedTypesScanner(resourceLoader, managedClassNameFilter.getIfAvailable()) + .scan(packagesToScan); } private static String[] getPackagesToScan(BeanFactory beanFactory) { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/AbstractJpaAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/AbstractJpaAutoConfigurationTests.java index 869607e7e87..d5efec995d6 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/AbstractJpaAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/AbstractJpaAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -54,6 +54,7 @@ import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.JpaVendorAdapter; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager; +import org.springframework.orm.jpa.persistenceunit.ManagedClassNameFilter; import org.springframework.orm.jpa.persistenceunit.PersistenceManagedTypes; import org.springframework.orm.jpa.persistenceunit.PersistenceUnitManager; import org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter; @@ -69,6 +70,7 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Phillip Webb * @author Dave Syer * @author Stephane Nicoll + * @author Yanming Zhou */ abstract class AbstractJpaAutoConfigurationTests { @@ -279,6 +281,16 @@ abstract class AbstractJpaAutoConfigurationTests { }); } + @Test + void customManagedClassNameFilter() { + this.contextRunner.withBean(ManagedClassNameFilter.class, () -> (s) -> !s.endsWith("City")) + .withUserConfiguration(AutoConfigurePackageForCountry.class) + .run((context) -> { + EntityManager entityManager = context.getBean(EntityManagerFactory.class).createEntityManager(); + assertThat(getManagedJavaTypes(entityManager)).contains(Country.class).doesNotContain(City.class); + }); + } + private Class[] getManagedJavaTypes(EntityManager entityManager) { Set> managedTypes = entityManager.getMetamodel().getManagedTypes(); return managedTypes.stream().map(ManagedType::getJavaType).toArray(Class[]::new); @@ -423,6 +435,12 @@ abstract class AbstractJpaAutoConfigurationTests { } + @Configuration(proxyBeanMethods = false) + @TestAutoConfigurationPackage(Country.class) + static class AutoConfigurePackageForCountry { + + } + @Configuration(proxyBeanMethods = false) @TestAutoConfigurationPackage(AbstractJpaAutoConfigurationTests.class) static class TestConfigurationWithCustomPersistenceUnitManager {