From cdd39bafd736b5bce8ceb5cc6df306eb55e04168 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Nicoll?= Date: Mon, 15 Sep 2025 18:00:52 +0200 Subject: [PATCH] Introduce spring-boot-persistence This commit adds a spring-boot-persistence module with data technology independent features. This provides a better home for EntityScan and PersistenceExceptionTranslationAutoConfiguration. Closes gh-45328 --- .../DocumentConfigurationProperties.java | 2 +- core/spring-boot-autoconfigure/build.gradle | 1 - documentation/spring-boot-docs/build.gradle | 1 + .../modules/how-to/pages/data-access.adoc | 2 +- .../modules/reference/pages/data/nosql.adoc | 12 +++--- .../modules/reference/pages/data/sql.adoc | 2 +- .../pages/using/structuring-your-code.adoc | 2 +- .../MyApplication.java | 2 +- .../MyApplication.kt | 2 +- .../CassandraDataAutoConfiguration.java | 2 +- .../CassandraDataAutoConfigurationTests.java | 2 +- ...draReactiveDataAutoConfigurationTests.java | 2 +- module/spring-boot-data-commons/build.gradle | 1 + .../CouchbaseDataConfiguration.java | 2 +- .../CouchbaseDataAutoConfigurationTests.java | 2 +- ...aseReactiveDataAutoConfigurationTests.java | 2 +- .../ElasticsearchDataConfiguration.java | 2 +- .../JdbcRepositoriesAutoConfiguration.java | 2 +- .../autoconfigure/MongoDataConfiguration.java | 2 +- .../MongoDataAutoConfigurationTests.java | 2 +- .../Neo4jDataAutoConfiguration.java | 2 +- .../R2dbcDataAutoConfiguration.java | 2 +- .../autoconfigure/JpaBaseConfiguration.java | 2 +- module/spring-boot-persistence/build.gradle | 43 +++++++++++++++++++ .../autoconfigure}/EntityScan.java | 2 +- .../autoconfigure}/EntityScanPackages.java | 2 +- .../autoconfigure}/EntityScanner.java | 2 +- ...ExceptionTranslationAutoConfiguration.java | 4 +- .../autoconfigure}/package-info.java | 2 +- ...itional-spring-configuration-metadata.json | 18 ++++++++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../EntityScanPackagesTests.java | 2 +- .../autoconfigure}/EntityScannerTests.java | 25 +++++------ ...tionTranslationAutoConfigurationTests.java | 4 +- .../autoconfigure}/scan/a/EmbeddableA.java | 2 +- .../autoconfigure}/scan/a/EntityA.java | 2 +- .../autoconfigure}/scan/b/EmbeddableB.java | 2 +- .../autoconfigure}/scan/b/EntityB.java | 2 +- .../autoconfigure}/scan/c/EmbeddableC.java | 2 +- .../autoconfigure}/scan/c/EntityC.java | 2 +- .../test/autoconfigure/ExampleTestConfig.java | 2 +- ...izerFactoryWithAutoConfigurationTests.java | 2 +- module/spring-boot-tx/build.gradle | 4 +- ...itional-spring-configuration-metadata.json | 6 --- ...ot.autoconfigure.AutoConfiguration.imports | 1 - settings.gradle | 1 + 46 files changed, 121 insertions(+), 65 deletions(-) create mode 100644 module/spring-boot-persistence/build.gradle rename {core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/domain => module/spring-boot-persistence/src/main/java/org/springframework/boot/persistence/autoconfigure}/EntityScan.java (97%) rename {core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/domain => module/spring-boot-persistence/src/main/java/org/springframework/boot/persistence/autoconfigure}/EntityScanPackages.java (99%) rename {core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/domain => module/spring-boot-persistence/src/main/java/org/springframework/boot/persistence/autoconfigure}/EntityScanner.java (98%) rename module/{spring-boot-tx/src/main/java/org/springframework/boot/transaction => spring-boot-persistence/src/main/java/org/springframework/boot/persistence}/autoconfigure/PersistenceExceptionTranslationAutoConfiguration.java (92%) rename {core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/domain => module/spring-boot-persistence/src/main/java/org/springframework/boot/persistence/autoconfigure}/package-info.java (92%) create mode 100644 module/spring-boot-persistence/src/main/resources/META-INF/additional-spring-configuration-metadata.json create mode 100644 module/spring-boot-persistence/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports rename {core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain => module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure}/EntityScanPackagesTests.java (99%) rename {core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain => module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure}/EntityScannerTests.java (86%) rename module/{spring-boot-tx/src/test/java/org/springframework/boot/transaction => spring-boot-persistence/src/test/java/org/springframework/boot/persistence}/autoconfigure/PersistenceExceptionTranslationAutoConfigurationTests.java (98%) rename {core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain => module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure}/scan/a/EmbeddableA.java (91%) rename {core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain => module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure}/scan/a/EntityA.java (91%) rename {core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain => module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure}/scan/b/EmbeddableB.java (91%) rename {core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain => module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure}/scan/b/EntityB.java (91%) rename {core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain => module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure}/scan/c/EmbeddableC.java (91%) rename {core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain => module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure}/scan/c/EntityC.java (91%) diff --git a/buildSrc/src/main/java/org/springframework/boot/build/context/properties/DocumentConfigurationProperties.java b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/DocumentConfigurationProperties.java index 691dc7e6548..d6070017d25 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/context/properties/DocumentConfigurationProperties.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/DocumentConfigurationProperties.java @@ -130,7 +130,7 @@ public abstract class DocumentConfigurationProperties extends DefaultTask { config.accept("spring.ldap"); config.accept("spring.mongodb"); config.accept("spring.neo4j"); - config.accept("spring.dao"); + config.accept("spring.persistence"); config.accept("spring.data"); config.accept("spring.datasource"); config.accept("spring.jooq"); diff --git a/core/spring-boot-autoconfigure/build.gradle b/core/spring-boot-autoconfigure/build.gradle index 8382548e338..4e6853458e4 100644 --- a/core/spring-boot-autoconfigure/build.gradle +++ b/core/spring-boot-autoconfigure/build.gradle @@ -30,7 +30,6 @@ dependencies { optional("com.github.ben-manes.caffeine:caffeine") optional("org.aspectj:aspectjweaver") - optional("jakarta.persistence:jakarta.persistence-api") optional("jakarta.servlet:jakarta.servlet-api") optional("javax.money:money-api") optional("org.springframework:spring-web") diff --git a/documentation/spring-boot-docs/build.gradle b/documentation/spring-boot-docs/build.gradle index 4401942f26d..bc93c50f842 100644 --- a/documentation/spring-boot-docs/build.gradle +++ b/documentation/spring-boot-docs/build.gradle @@ -105,6 +105,7 @@ dependencies { implementation(project(path: ":module:spring-boot-jsonb")) implementation(project(path: ":module:spring-boot-ldap")) implementation(project(path: ":module:spring-boot-micrometer-metrics")) + implementation(project(path: ":module:spring-boot-persistence")) implementation(project(path: ":module:spring-boot-r2dbc")) implementation(project(path: ":module:spring-boot-reactor-netty")) implementation(project(path: ":module:spring-boot-restclient")) diff --git a/documentation/spring-boot-docs/src/docs/antora/modules/how-to/pages/data-access.adoc b/documentation/spring-boot-docs/src/docs/antora/modules/how-to/pages/data-access.adoc index baacfeeebf7..09f0dd66a3b 100644 --- a/documentation/spring-boot-docs/src/docs/antora/modules/how-to/pages/data-access.adoc +++ b/documentation/spring-boot-docs/src/docs/antora/modules/how-to/pages/data-access.adoc @@ -176,7 +176,7 @@ For more about Spring Data, see the {url-spring-data-site}[Spring Data project p == Separate @Entity Definitions from Spring Configuration Spring Boot determines the location of your javadoc:jakarta.persistence.Entity[format=annotation] definitions by scanning the xref:reference:using/auto-configuration.adoc#using.auto-configuration.packages[auto-configuration packages]. -For more control, use the javadoc:org.springframework.boot.autoconfigure.domain.EntityScan[format=annotation] annotation, as shown in the following example: +For more control, use the javadoc:org.springframework.boot.persistence.autoconfigure.EntityScan[format=annotation] annotation, as shown in the following example: include-code::MyApplication[] diff --git a/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/data/nosql.adoc b/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/data/nosql.adoc index d5ec6fb9a00..42cffeb814e 100644 --- a/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/data/nosql.adoc +++ b/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/data/nosql.adoc @@ -220,7 +220,7 @@ include-code::CityRepository[] Repositories and documents are found through scanning. By default, the xref:using/auto-configuration.adoc#using.auto-configuration.packages[auto-configuration packages] are scanned. -You can customize the locations to look for repositories and documents by using javadoc:org.springframework.data.mongodb.repository.config.EnableMongoRepositories[format=annotation] and javadoc:org.springframework.boot.autoconfigure.domain.EntityScan[format=annotation] respectively. +You can customize the locations to look for repositories and documents by using javadoc:org.springframework.data.mongodb.repository.config.EnableMongoRepositories[format=annotation] and javadoc:org.springframework.boot.persistence.autoconfigure.EntityScan[format=annotation] respectively. TIP: For complete details of Spring Data MongoDB, including its rich object mapping technologies, see its {url-spring-data-mongodb-docs}[reference documentation]. @@ -279,7 +279,7 @@ When Project Reactor is available on the classpath, the reactive style is also a Repositories and entities are found through scanning. By default, the xref:using/auto-configuration.adoc#using.auto-configuration.packages[auto-configuration packages] are scanned. -You can customize the locations to look for repositories and entities by using javadoc:org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories[format=annotation] and javadoc:org.springframework.boot.autoconfigure.domain.EntityScan[format=annotation] respectively. +You can customize the locations to look for repositories and entities by using javadoc:org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories[format=annotation] and javadoc:org.springframework.boot.persistence.autoconfigure.EntityScan[format=annotation] respectively. [NOTE] ==== @@ -402,7 +402,7 @@ You could take the JPA example from earlier and, assuming that `City` is now an Repositories and documents are found through scanning. By default, the xref:using/auto-configuration.adoc#using.auto-configuration.packages[auto-configuration packages] are scanned. -You can customize the locations to look for repositories and documents by using javadoc:org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories[format=annotation] and javadoc:org.springframework.boot.autoconfigure.domain.EntityScan[format=annotation] respectively. +You can customize the locations to look for repositories and documents by using javadoc:org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories[format=annotation] and javadoc:org.springframework.boot.persistence.autoconfigure.EntityScan[format=annotation] respectively. TIP: For complete details of Spring Data Elasticsearch, see the {url-spring-data-elasticsearch-docs}[reference documentation]. @@ -520,7 +520,7 @@ Currently, this is more limited than the JPA repositories discussed earlier and Repositories and entities are found through scanning. By default, the xref:using/auto-configuration.adoc#using.auto-configuration.packages[auto-configuration packages] are scanned. -You can customize the locations to look for repositories and entities by using javadoc:org.springframework.data.cassandra.repository.config.EnableCassandraRepositories[format=annotation] and javadoc:org.springframework.boot.autoconfigure.domain.EntityScan[format=annotation] respectively. +You can customize the locations to look for repositories and entities by using javadoc:org.springframework.data.cassandra.repository.config.EnableCassandraRepositories[format=annotation] and javadoc:org.springframework.boot.persistence.autoconfigure.EntityScan[format=annotation] respectively. TIP: For complete details of Spring Data Cassandra, see the {url-spring-data-cassandra-docs}[reference documentation]. @@ -610,7 +610,7 @@ Spring Data includes repository support for Couchbase. Repositories and documents are found through scanning. By default, the xref:using/auto-configuration.adoc#using.auto-configuration.packages[auto-configuration packages] are scanned. -You can customize the locations to look for repositories and documents by using javadoc:org.springframework.data.couchbase.repository.config.EnableCouchbaseRepositories[format=annotation] and javadoc:org.springframework.boot.autoconfigure.domain.EntityScan[format=annotation] respectively. +You can customize the locations to look for repositories and documents by using javadoc:org.springframework.data.couchbase.repository.config.EnableCouchbaseRepositories[format=annotation] and javadoc:org.springframework.boot.persistence.autoconfigure.EntityScan[format=annotation] respectively. For complete details of Spring Data Couchbase, see the {url-spring-data-couchbase-docs}[reference documentation]. @@ -683,7 +683,7 @@ Spring Data includes repository support for LDAP. Repositories and documents are found through scanning. By default, the xref:using/auto-configuration.adoc#using.auto-configuration.packages[auto-configuration packages] are scanned. -You can customize the locations to look for repositories and documents by using javadoc:org.springframework.data.ldap.repository.config.EnableLdapRepositories[format=annotation] and javadoc:org.springframework.boot.autoconfigure.domain.EntityScan[format=annotation] respectively. +You can customize the locations to look for repositories and documents by using javadoc:org.springframework.data.ldap.repository.config.EnableLdapRepositories[format=annotation] and javadoc:org.springframework.boot.persistence.autoconfigure.EntityScan[format=annotation] respectively. TIP: For complete details of Spring Data LDAP, see the {url-spring-data-ldap-docs}[reference documentation]. diff --git a/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/data/sql.adoc b/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/data/sql.adoc index 178fd645710..56f2471c3e7 100644 --- a/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/data/sql.adoc +++ b/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/data/sql.adoc @@ -227,7 +227,7 @@ A typical entity class resembles the following example: include-code::City[] -TIP: You can customize entity scanning locations by using the javadoc:org.springframework.boot.autoconfigure.domain.EntityScan[format=annotation] annotation. +TIP: You can customize entity scanning locations by using the javadoc:org.springframework.boot.persistence.autoconfigure.EntityScan[format=annotation] annotation. See the xref:how-to:data-access.adoc#howto.data-access.separate-entity-definitions-from-spring-configuration[] section of the "`How-to Guides`". diff --git a/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/using/structuring-your-code.adoc b/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/using/structuring-your-code.adoc index 975082f7266..2f85b61c8c8 100644 --- a/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/using/structuring-your-code.adoc +++ b/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/using/structuring-your-code.adoc @@ -13,7 +13,7 @@ TIP: If you wish to enforce a structure based on domains, take a look at https:/ When a class does not include a `package` declaration, it is considered to be in the "`default package`". The use of the "`default package`" is generally discouraged and should be avoided. -It can cause particular problems for Spring Boot applications that use the javadoc:org.springframework.context.annotation.ComponentScan[format=annotation], javadoc:org.springframework.boot.context.properties.ConfigurationPropertiesScan[format=annotation], javadoc:org.springframework.boot.autoconfigure.domain.EntityScan[format=annotation], or javadoc:org.springframework.boot.autoconfigure.SpringBootApplication[format=annotation] annotations, since every class from every jar is read. +It can cause particular problems for Spring Boot applications that use the javadoc:org.springframework.context.annotation.ComponentScan[format=annotation], javadoc:org.springframework.boot.context.properties.ConfigurationPropertiesScan[format=annotation], javadoc:org.springframework.boot.persistence.autoconfigure.EntityScan[format=annotation], or javadoc:org.springframework.boot.autoconfigure.SpringBootApplication[format=annotation] annotations, since every class from every jar is read. TIP: We recommend that you follow Java's recommended package naming conventions and use a reversed domain name (for example, `com.example.project`). diff --git a/documentation/spring-boot-docs/src/main/java/org/springframework/boot/docs/howto/dataaccess/separateentitydefinitionsfromspringconfiguration/MyApplication.java b/documentation/spring-boot-docs/src/main/java/org/springframework/boot/docs/howto/dataaccess/separateentitydefinitionsfromspringconfiguration/MyApplication.java index 416e126c37c..efa8db1d9cf 100644 --- a/documentation/spring-boot-docs/src/main/java/org/springframework/boot/docs/howto/dataaccess/separateentitydefinitionsfromspringconfiguration/MyApplication.java +++ b/documentation/spring-boot-docs/src/main/java/org/springframework/boot/docs/howto/dataaccess/separateentitydefinitionsfromspringconfiguration/MyApplication.java @@ -17,7 +17,7 @@ package org.springframework.boot.docs.howto.dataaccess.separateentitydefinitionsfromspringconfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.boot.persistence.autoconfigure.EntityScan; import org.springframework.context.annotation.Configuration; @Configuration(proxyBeanMethods = false) diff --git a/documentation/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/howto/dataaccess/separateentitydefinitionsfromspringconfiguration/MyApplication.kt b/documentation/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/howto/dataaccess/separateentitydefinitionsfromspringconfiguration/MyApplication.kt index f0ca12c4de9..3e5a36d81fc 100644 --- a/documentation/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/howto/dataaccess/separateentitydefinitionsfromspringconfiguration/MyApplication.kt +++ b/documentation/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/howto/dataaccess/separateentitydefinitionsfromspringconfiguration/MyApplication.kt @@ -17,7 +17,7 @@ package org.springframework.boot.docs.howto.dataaccess.separateentitydefinitionsfromspringconfiguration import org.springframework.boot.autoconfigure.EnableAutoConfiguration -import org.springframework.boot.autoconfigure.domain.EntityScan +import org.springframework.boot.persistence.autoconfigure.EntityScan import org.springframework.context.annotation.Configuration @Configuration(proxyBeanMethods = false) diff --git a/module/spring-boot-data-cassandra/src/main/java/org/springframework/boot/data/cassandra/autoconfigure/CassandraDataAutoConfiguration.java b/module/spring-boot-data-cassandra/src/main/java/org/springframework/boot/data/cassandra/autoconfigure/CassandraDataAutoConfiguration.java index 4b99cab2b4a..b1f6b768a43 100644 --- a/module/spring-boot-data-cassandra/src/main/java/org/springframework/boot/data/cassandra/autoconfigure/CassandraDataAutoConfiguration.java +++ b/module/spring-boot-data-cassandra/src/main/java/org/springframework/boot/data/cassandra/autoconfigure/CassandraDataAutoConfiguration.java @@ -28,9 +28,9 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.domain.EntityScanPackages; import org.springframework.boot.cassandra.autoconfigure.CassandraAutoConfiguration; import org.springframework.boot.context.properties.bind.Binder; +import org.springframework.boot.persistence.autoconfigure.EntityScanPackages; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Lazy; import org.springframework.core.env.Environment; diff --git a/module/spring-boot-data-cassandra/src/test/java/org/springframework/boot/data/cassandra/autoconfigure/CassandraDataAutoConfigurationTests.java b/module/spring-boot-data-cassandra/src/test/java/org/springframework/boot/data/cassandra/autoconfigure/CassandraDataAutoConfigurationTests.java index a84e4a01128..a76665c32cf 100644 --- a/module/spring-boot-data-cassandra/src/test/java/org/springframework/boot/data/cassandra/autoconfigure/CassandraDataAutoConfigurationTests.java +++ b/module/spring-boot-data-cassandra/src/test/java/org/springframework/boot/data/cassandra/autoconfigure/CassandraDataAutoConfigurationTests.java @@ -22,9 +22,9 @@ import com.datastax.oss.driver.api.core.CqlSession; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; -import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.boot.cassandra.autoconfigure.CassandraAutoConfiguration; import org.springframework.boot.data.cassandra.domain.city.City; +import org.springframework.boot.persistence.autoconfigure.EntityScan; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; diff --git a/module/spring-boot-data-cassandra/src/test/java/org/springframework/boot/data/cassandra/autoconfigure/CassandraReactiveDataAutoConfigurationTests.java b/module/spring-boot-data-cassandra/src/test/java/org/springframework/boot/data/cassandra/autoconfigure/CassandraReactiveDataAutoConfigurationTests.java index 588fa03570f..1173721584e 100644 --- a/module/spring-boot-data-cassandra/src/test/java/org/springframework/boot/data/cassandra/autoconfigure/CassandraReactiveDataAutoConfigurationTests.java +++ b/module/spring-boot-data-cassandra/src/test/java/org/springframework/boot/data/cassandra/autoconfigure/CassandraReactiveDataAutoConfigurationTests.java @@ -19,9 +19,9 @@ package org.springframework.boot.data.cassandra.autoconfigure; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; -import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.boot.cassandra.autoconfigure.CassandraAutoConfiguration; import org.springframework.boot.data.cassandra.domain.city.City; +import org.springframework.boot.persistence.autoconfigure.EntityScan; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Configuration; import org.springframework.data.cassandra.core.ReactiveCassandraTemplate; diff --git a/module/spring-boot-data-commons/build.gradle b/module/spring-boot-data-commons/build.gradle index 382c173388e..e7d300cdaba 100644 --- a/module/spring-boot-data-commons/build.gradle +++ b/module/spring-boot-data-commons/build.gradle @@ -26,6 +26,7 @@ description = "Spring Boot Data Commons" dependencies { api(project(":core:spring-boot")) + api(project(":module:spring-boot-persistence")) api("org.springframework.data:spring-data-commons") optional(project(":core:spring-boot-autoconfigure")) diff --git a/module/spring-boot-data-couchbase/src/main/java/org/springframework/boot/data/couchbase/autoconfigure/CouchbaseDataConfiguration.java b/module/spring-boot-data-couchbase/src/main/java/org/springframework/boot/data/couchbase/autoconfigure/CouchbaseDataConfiguration.java index 2de5b1e77ab..f51fa58dbc9 100644 --- a/module/spring-boot-data-couchbase/src/main/java/org/springframework/boot/data/couchbase/autoconfigure/CouchbaseDataConfiguration.java +++ b/module/spring-boot-data-couchbase/src/main/java/org/springframework/boot/data/couchbase/autoconfigure/CouchbaseDataConfiguration.java @@ -20,7 +20,7 @@ import java.util.Collections; import org.springframework.beans.BeanUtils; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.domain.EntityScanner; +import org.springframework.boot.persistence.autoconfigure.EntityScanner; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/module/spring-boot-data-couchbase/src/test/java/org/springframework/boot/data/couchbase/autoconfigure/CouchbaseDataAutoConfigurationTests.java b/module/spring-boot-data-couchbase/src/test/java/org/springframework/boot/data/couchbase/autoconfigure/CouchbaseDataAutoConfigurationTests.java index 5d144610838..46fcb6b4993 100644 --- a/module/spring-boot-data-couchbase/src/test/java/org/springframework/boot/data/couchbase/autoconfigure/CouchbaseDataAutoConfigurationTests.java +++ b/module/spring-boot-data-couchbase/src/test/java/org/springframework/boot/data/couchbase/autoconfigure/CouchbaseDataAutoConfigurationTests.java @@ -21,10 +21,10 @@ import java.util.Collections; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; -import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.boot.couchbase.autoconfigure.CouchbaseAutoConfiguration; import org.springframework.boot.couchbase.autoconfigure.CouchbaseProperties; import org.springframework.boot.data.couchbase.domain.city.City; +import org.springframework.boot.persistence.autoconfigure.EntityScan; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.boot.validation.autoconfigure.ValidationAutoConfiguration; import org.springframework.context.annotation.Bean; diff --git a/module/spring-boot-data-couchbase/src/test/java/org/springframework/boot/data/couchbase/autoconfigure/CouchbaseReactiveDataAutoConfigurationTests.java b/module/spring-boot-data-couchbase/src/test/java/org/springframework/boot/data/couchbase/autoconfigure/CouchbaseReactiveDataAutoConfigurationTests.java index 0fe0c39ef37..63a0939241b 100644 --- a/module/spring-boot-data-couchbase/src/test/java/org/springframework/boot/data/couchbase/autoconfigure/CouchbaseReactiveDataAutoConfigurationTests.java +++ b/module/spring-boot-data-couchbase/src/test/java/org/springframework/boot/data/couchbase/autoconfigure/CouchbaseReactiveDataAutoConfigurationTests.java @@ -21,10 +21,10 @@ import java.util.Collections; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; -import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.boot.couchbase.autoconfigure.CouchbaseAutoConfiguration; import org.springframework.boot.couchbase.autoconfigure.CouchbaseProperties; import org.springframework.boot.data.couchbase.domain.city.City; +import org.springframework.boot.persistence.autoconfigure.EntityScan; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.boot.validation.autoconfigure.ValidationAutoConfiguration; import org.springframework.context.annotation.Bean; diff --git a/module/spring-boot-data-elasticsearch/src/main/java/org/springframework/boot/data/elasticsearch/autoconfigure/ElasticsearchDataConfiguration.java b/module/spring-boot-data-elasticsearch/src/main/java/org/springframework/boot/data/elasticsearch/autoconfigure/ElasticsearchDataConfiguration.java index 57d789af979..ea4d0ee8786 100644 --- a/module/spring-boot-data-elasticsearch/src/main/java/org/springframework/boot/data/elasticsearch/autoconfigure/ElasticsearchDataConfiguration.java +++ b/module/spring-boot-data-elasticsearch/src/main/java/org/springframework/boot/data/elasticsearch/autoconfigure/ElasticsearchDataConfiguration.java @@ -23,7 +23,7 @@ import co.elastic.clients.elasticsearch.ElasticsearchClient; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.domain.EntityScanner; +import org.springframework.boot.persistence.autoconfigure.EntityScanner; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/module/spring-boot-data-jdbc/src/main/java/org/springframework/boot/data/jdbc/autoconfigure/JdbcRepositoriesAutoConfiguration.java b/module/spring-boot-data-jdbc/src/main/java/org/springframework/boot/data/jdbc/autoconfigure/JdbcRepositoriesAutoConfiguration.java index a618180ba1f..c88e615f1de 100644 --- a/module/spring-boot-data-jdbc/src/main/java/org/springframework/boot/data/jdbc/autoconfigure/JdbcRepositoriesAutoConfiguration.java +++ b/module/spring-boot-data-jdbc/src/main/java/org/springframework/boot/data/jdbc/autoconfigure/JdbcRepositoriesAutoConfiguration.java @@ -25,10 +25,10 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnBooleanProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.domain.EntityScanner; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.jdbc.autoconfigure.DataSourceTransactionManagerAutoConfiguration; import org.springframework.boot.jdbc.autoconfigure.JdbcTemplateAutoConfiguration; +import org.springframework.boot.persistence.autoconfigure.EntityScanner; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataConfiguration.java b/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataConfiguration.java index ed199cd8dd2..923f4c72fdc 100644 --- a/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataConfiguration.java +++ b/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataConfiguration.java @@ -19,8 +19,8 @@ package org.springframework.boot.data.mongodb.autoconfigure; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.domain.EntityScanner; import org.springframework.boot.context.properties.PropertyMapper; +import org.springframework.boot.persistence.autoconfigure.EntityScanner; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataAutoConfigurationTests.java b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataAutoConfigurationTests.java index 016209abff7..98f2155dcb2 100644 --- a/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataAutoConfigurationTests.java +++ b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataAutoConfigurationTests.java @@ -32,12 +32,12 @@ import org.springframework.beans.factory.BeanCreationException; import org.springframework.boot.autoconfigure.AutoConfigurationPackages; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration; -import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.boot.data.mongodb.autoconfigure.domain.city.City; import org.springframework.boot.data.mongodb.autoconfigure.domain.country.Country; import org.springframework.boot.mongodb.autoconfigure.MongoAutoConfiguration; import org.springframework.boot.mongodb.autoconfigure.MongoConnectionDetails; import org.springframework.boot.mongodb.autoconfigure.PropertiesMongoConnectionDetails; +import org.springframework.boot.persistence.autoconfigure.EntityScan; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; diff --git a/module/spring-boot-data-neo4j/src/main/java/org/springframework/boot/data/neo4j/autoconfigure/Neo4jDataAutoConfiguration.java b/module/spring-boot-data-neo4j/src/main/java/org/springframework/boot/data/neo4j/autoconfigure/Neo4jDataAutoConfiguration.java index 60f8eaf8ea9..1c977854cd5 100644 --- a/module/spring-boot-data-neo4j/src/main/java/org/springframework/boot/data/neo4j/autoconfigure/Neo4jDataAutoConfiguration.java +++ b/module/spring-boot-data-neo4j/src/main/java/org/springframework/boot/data/neo4j/autoconfigure/Neo4jDataAutoConfiguration.java @@ -26,9 +26,9 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.domain.EntityScanner; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.neo4j.autoconfigure.Neo4jAutoConfiguration; +import org.springframework.boot.persistence.autoconfigure.EntityScanner; import org.springframework.boot.transaction.autoconfigure.TransactionAutoConfiguration; import org.springframework.boot.transaction.autoconfigure.TransactionManagerCustomizationAutoConfiguration; import org.springframework.boot.transaction.autoconfigure.TransactionManagerCustomizers; diff --git a/module/spring-boot-data-r2dbc/src/main/java/org/springframework/boot/data/r2dbc/autoconfigure/R2dbcDataAutoConfiguration.java b/module/spring-boot-data-r2dbc/src/main/java/org/springframework/boot/data/r2dbc/autoconfigure/R2dbcDataAutoConfiguration.java index 8ed37f24240..3b4f85dda8b 100644 --- a/module/spring-boot-data-r2dbc/src/main/java/org/springframework/boot/data/r2dbc/autoconfigure/R2dbcDataAutoConfiguration.java +++ b/module/spring-boot-data-r2dbc/src/main/java/org/springframework/boot/data/r2dbc/autoconfigure/R2dbcDataAutoConfiguration.java @@ -26,7 +26,7 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate; -import org.springframework.boot.autoconfigure.domain.EntityScanner; +import org.springframework.boot.persistence.autoconfigure.EntityScanner; import org.springframework.boot.r2dbc.autoconfigure.R2dbcAutoConfiguration; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; diff --git a/module/spring-boot-jpa/src/main/java/org/springframework/boot/jpa/autoconfigure/JpaBaseConfiguration.java b/module/spring-boot-jpa/src/main/java/org/springframework/boot/jpa/autoconfigure/JpaBaseConfiguration.java index de2cbe802bf..47bbe2e9a8a 100644 --- a/module/spring-boot-jpa/src/main/java/org/springframework/boot/jpa/autoconfigure/JpaBaseConfiguration.java +++ b/module/spring-boot-jpa/src/main/java/org/springframework/boot/jpa/autoconfigure/JpaBaseConfiguration.java @@ -37,9 +37,9 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingFilterBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type; -import org.springframework.boot.autoconfigure.domain.EntityScanPackages; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.jpa.EntityManagerFactoryBuilder; +import org.springframework.boot.persistence.autoconfigure.EntityScanPackages; import org.springframework.boot.transaction.autoconfigure.TransactionManagerCustomizers; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/module/spring-boot-persistence/build.gradle b/module/spring-boot-persistence/build.gradle new file mode 100644 index 00000000000..479a38ef10d --- /dev/null +++ b/module/spring-boot-persistence/build.gradle @@ -0,0 +1,43 @@ +/* + * Copyright 2012-present 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. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +plugins { + id "java-library" + id "org.springframework.boot.auto-configuration" + id "org.springframework.boot.configuration-properties" + id "org.springframework.boot.deployed" + id "org.springframework.boot.optional-dependencies" +} + +description = "Spring Boot Persistence" + +dependencies { + api(project(":core:spring-boot")) + api("org.springframework:spring-tx") + + optional(project(":core:spring-boot-autoconfigure")) + + testImplementation(project(":core:spring-boot-test")) + testImplementation(project(":test-support:spring-boot-test-support")) + testImplementation("com.zaxxer:HikariCP") + testImplementation("jakarta.persistence:jakarta.persistence-api") + testImplementation("org.hibernate.orm:hibernate-core") + testImplementation("org.hsqldb:hsqldb") + testImplementation("org.springframework:spring-jdbc") + testImplementation("org.springframework:spring-orm") + + testRuntimeOnly("ch.qos.logback:logback-classic") +} diff --git a/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/domain/EntityScan.java b/module/spring-boot-persistence/src/main/java/org/springframework/boot/persistence/autoconfigure/EntityScan.java similarity index 97% rename from core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/domain/EntityScan.java rename to module/spring-boot-persistence/src/main/java/org/springframework/boot/persistence/autoconfigure/EntityScan.java index d242ff16d4e..ebda9080284 100644 --- a/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/domain/EntityScan.java +++ b/module/spring-boot-persistence/src/main/java/org/springframework/boot/persistence/autoconfigure/EntityScan.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.autoconfigure.domain; +package org.springframework.boot.persistence.autoconfigure; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; diff --git a/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/domain/EntityScanPackages.java b/module/spring-boot-persistence/src/main/java/org/springframework/boot/persistence/autoconfigure/EntityScanPackages.java similarity index 99% rename from core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/domain/EntityScanPackages.java rename to module/spring-boot-persistence/src/main/java/org/springframework/boot/persistence/autoconfigure/EntityScanPackages.java index bae43215b24..5781013e022 100644 --- a/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/domain/EntityScanPackages.java +++ b/module/spring-boot-persistence/src/main/java/org/springframework/boot/persistence/autoconfigure/EntityScanPackages.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.autoconfigure.domain; +package org.springframework.boot.persistence.autoconfigure; import java.util.ArrayList; import java.util.Arrays; diff --git a/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/domain/EntityScanner.java b/module/spring-boot-persistence/src/main/java/org/springframework/boot/persistence/autoconfigure/EntityScanner.java similarity index 98% rename from core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/domain/EntityScanner.java rename to module/spring-boot-persistence/src/main/java/org/springframework/boot/persistence/autoconfigure/EntityScanner.java index 85c66738446..a4093ee67a5 100644 --- a/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/domain/EntityScanner.java +++ b/module/spring-boot-persistence/src/main/java/org/springframework/boot/persistence/autoconfigure/EntityScanner.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.autoconfigure.domain; +package org.springframework.boot.persistence.autoconfigure; import java.lang.annotation.Annotation; import java.util.Collections; diff --git a/module/spring-boot-tx/src/main/java/org/springframework/boot/transaction/autoconfigure/PersistenceExceptionTranslationAutoConfiguration.java b/module/spring-boot-persistence/src/main/java/org/springframework/boot/persistence/autoconfigure/PersistenceExceptionTranslationAutoConfiguration.java similarity index 92% rename from module/spring-boot-tx/src/main/java/org/springframework/boot/transaction/autoconfigure/PersistenceExceptionTranslationAutoConfiguration.java rename to module/spring-boot-persistence/src/main/java/org/springframework/boot/persistence/autoconfigure/PersistenceExceptionTranslationAutoConfiguration.java index 823414e36bd..b86ff2dea1a 100644 --- a/module/spring-boot-tx/src/main/java/org/springframework/boot/transaction/autoconfigure/PersistenceExceptionTranslationAutoConfiguration.java +++ b/module/spring-boot-persistence/src/main/java/org/springframework/boot/persistence/autoconfigure/PersistenceExceptionTranslationAutoConfiguration.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.transaction.autoconfigure; +package org.springframework.boot.persistence.autoconfigure; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -40,7 +40,7 @@ public final class PersistenceExceptionTranslationAutoConfiguration { @Bean @ConditionalOnMissingBean - @ConditionalOnBooleanProperty(name = "spring.dao.exceptiontranslation.enabled", matchIfMissing = true) + @ConditionalOnBooleanProperty(name = "spring.persistence.exceptiontranslation.enabled", matchIfMissing = true) static PersistenceExceptionTranslationPostProcessor persistenceExceptionTranslationPostProcessor( Environment environment) { PersistenceExceptionTranslationPostProcessor postProcessor = new PersistenceExceptionTranslationPostProcessor(); diff --git a/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/domain/package-info.java b/module/spring-boot-persistence/src/main/java/org/springframework/boot/persistence/autoconfigure/package-info.java similarity index 92% rename from core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/domain/package-info.java rename to module/spring-boot-persistence/src/main/java/org/springframework/boot/persistence/autoconfigure/package-info.java index 033f017bb33..4238f146b45 100644 --- a/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/domain/package-info.java +++ b/module/spring-boot-persistence/src/main/java/org/springframework/boot/persistence/autoconfigure/package-info.java @@ -18,6 +18,6 @@ * General purpose domain annotations and classes. */ @NullMarked -package org.springframework.boot.autoconfigure.domain; +package org.springframework.boot.persistence.autoconfigure; import org.jspecify.annotations.NullMarked; diff --git a/module/spring-boot-persistence/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/module/spring-boot-persistence/src/main/resources/META-INF/additional-spring-configuration-metadata.json new file mode 100644 index 00000000000..8b19c747776 --- /dev/null +++ b/module/spring-boot-persistence/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -0,0 +1,18 @@ +{ + "properties": [ + { + "name": "spring.dao.exceptiontranslation.enabled", + "type": "java.lang.Boolean", + "deprecation": { + "replacement": "spring.persistence.exceptiontranslation.enabled", + "level": "error" + } + }, + { + "name": "spring.persistence.exceptiontranslation.enabled", + "type": "java.lang.Boolean", + "description": "Whether to enable the PersistenceExceptionTranslationPostProcessor.", + "defaultValue": true + } + ] +} diff --git a/module/spring-boot-persistence/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/module/spring-boot-persistence/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 00000000000..1a80c6a41d2 --- /dev/null +++ b/module/spring-boot-persistence/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +org.springframework.boot.persistence.autoconfigure.PersistenceExceptionTranslationAutoConfiguration diff --git a/core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain/EntityScanPackagesTests.java b/module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/EntityScanPackagesTests.java similarity index 99% rename from core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain/EntityScanPackagesTests.java rename to module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/EntityScanPackagesTests.java index 4121435b468..78d34c49edd 100644 --- a/core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain/EntityScanPackagesTests.java +++ b/module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/EntityScanPackagesTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.autoconfigure.domain; +package org.springframework.boot.persistence.autoconfigure; import java.util.Collection; import java.util.Collections; diff --git a/core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain/EntityScannerTests.java b/module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/EntityScannerTests.java similarity index 86% rename from core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain/EntityScannerTests.java rename to module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/EntityScannerTests.java index ce9cfed8ef6..8f9b4280e08 100644 --- a/core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain/EntityScannerTests.java +++ b/module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/EntityScannerTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.autoconfigure.domain; +package org.springframework.boot.persistence.autoconfigure; import java.util.Collections; import java.util.Set; @@ -23,12 +23,12 @@ import jakarta.persistence.Embeddable; import jakarta.persistence.Entity; import org.junit.jupiter.api.Test; -import org.springframework.boot.autoconfigure.domain.scan.a.EmbeddableA; -import org.springframework.boot.autoconfigure.domain.scan.a.EntityA; -import org.springframework.boot.autoconfigure.domain.scan.b.EmbeddableB; -import org.springframework.boot.autoconfigure.domain.scan.b.EntityB; -import org.springframework.boot.autoconfigure.domain.scan.c.EmbeddableC; -import org.springframework.boot.autoconfigure.domain.scan.c.EntityC; +import org.springframework.boot.persistence.autoconfigure.scan.a.EmbeddableA; +import org.springframework.boot.persistence.autoconfigure.scan.a.EntityA; +import org.springframework.boot.persistence.autoconfigure.scan.b.EmbeddableB; +import org.springframework.boot.persistence.autoconfigure.scan.b.EntityB; +import org.springframework.boot.persistence.autoconfigure.scan.c.EmbeddableC; +import org.springframework.boot.persistence.autoconfigure.scan.c.EntityC; import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; @@ -68,7 +68,7 @@ class EntityScannerTests { @Test void scanShouldScanFromResolvedPlaceholderPackage() throws Exception { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); - TestPropertyValues.of("com.example.entity-package=org.springframework.boot.autoconfigure.domain.scan") + TestPropertyValues.of("com.example.entity-package=org.springframework.boot.persistence.autoconfigure.scan") .applyTo(context); context.register(ScanPlaceholderConfig.class); context.refresh(); @@ -104,7 +104,8 @@ class EntityScannerTests { void scanShouldUseCustomCandidateComponentProvider() throws ClassNotFoundException { ClassPathScanningCandidateComponentProvider candidateComponentProvider = mock( ClassPathScanningCandidateComponentProvider.class); - given(candidateComponentProvider.findCandidateComponents("org.springframework.boot.autoconfigure.domain.scan")) + given(candidateComponentProvider + .findCandidateComponents("org.springframework.boot.persistence.autoconfigure.scan")) .willReturn(Collections.emptySet()); AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ScanConfig.class); TestEntityScanner scanner = new TestEntityScanner(context, candidateComponentProvider); @@ -114,7 +115,7 @@ class EntityScannerTests { assertArg((typeFilter) -> assertThat(typeFilter).isInstanceOfSatisfying(AnnotationTypeFilter.class, (filter) -> assertThat(filter.getAnnotationType()).isEqualTo(Entity.class)))); then(candidateComponentProvider).should() - .findCandidateComponents("org.springframework.boot.autoconfigure.domain.scan"); + .findCandidateComponents("org.springframework.boot.persistence.autoconfigure.scan"); then(candidateComponentProvider).shouldHaveNoMoreInteractions(); } @@ -122,7 +123,7 @@ class EntityScannerTests { void scanShouldScanCommaSeparatedPackagesInPlaceholderPackage() throws Exception { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); TestPropertyValues - .of("com.example.entity-package=org.springframework.boot.autoconfigure.domain.scan.a,org.springframework.boot.autoconfigure.domain.scan.b") + .of("com.example.entity-package=org.springframework.boot.persistence.autoconfigure.scan.a,org.springframework.boot.persistence.autoconfigure.scan.b") .applyTo(context); context.register(ScanPlaceholderConfig.class); context.refresh(); @@ -151,7 +152,7 @@ class EntityScannerTests { } @Configuration(proxyBeanMethods = false) - @EntityScan("org.springframework.boot.autoconfigure.domain.scan") + @EntityScan("org.springframework.boot.persistence.autoconfigure.scan") static class ScanConfig { } diff --git a/module/spring-boot-tx/src/test/java/org/springframework/boot/transaction/autoconfigure/PersistenceExceptionTranslationAutoConfigurationTests.java b/module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/PersistenceExceptionTranslationAutoConfigurationTests.java similarity index 98% rename from module/spring-boot-tx/src/test/java/org/springframework/boot/transaction/autoconfigure/PersistenceExceptionTranslationAutoConfigurationTests.java rename to module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/PersistenceExceptionTranslationAutoConfigurationTests.java index 8115fb06cbd..d5f3f123a45 100644 --- a/module/spring-boot-tx/src/test/java/org/springframework/boot/transaction/autoconfigure/PersistenceExceptionTranslationAutoConfigurationTests.java +++ b/module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/PersistenceExceptionTranslationAutoConfigurationTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.transaction.autoconfigure; +package org.springframework.boot.persistence.autoconfigure; import java.io.Serializable; import java.lang.annotation.ElementType; @@ -93,7 +93,7 @@ class PersistenceExceptionTranslationAutoConfigurationTests { @Test void exceptionTranslationPostProcessorCanBeDisabled() { this.context = new AnnotationConfigApplicationContext(); - TestPropertyValues.of("spring.dao.exceptiontranslation.enabled=false").applyTo(this.context); + TestPropertyValues.of("spring.persistence.exceptiontranslation.enabled=false").applyTo(this.context); this.context.register(PersistenceExceptionTranslationAutoConfiguration.class); this.context.refresh(); Map beans = this.context diff --git a/core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain/scan/a/EmbeddableA.java b/module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/scan/a/EmbeddableA.java similarity index 91% rename from core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain/scan/a/EmbeddableA.java rename to module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/scan/a/EmbeddableA.java index 51f0b4da109..bf07cb1e9a9 100644 --- a/core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain/scan/a/EmbeddableA.java +++ b/module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/scan/a/EmbeddableA.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.autoconfigure.domain.scan.a; +package org.springframework.boot.persistence.autoconfigure.scan.a; import jakarta.persistence.Embeddable; diff --git a/core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain/scan/a/EntityA.java b/module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/scan/a/EntityA.java similarity index 91% rename from core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain/scan/a/EntityA.java rename to module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/scan/a/EntityA.java index 32471443510..a08e6385a57 100644 --- a/core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain/scan/a/EntityA.java +++ b/module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/scan/a/EntityA.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.autoconfigure.domain.scan.a; +package org.springframework.boot.persistence.autoconfigure.scan.a; import jakarta.persistence.Entity; diff --git a/core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain/scan/b/EmbeddableB.java b/module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/scan/b/EmbeddableB.java similarity index 91% rename from core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain/scan/b/EmbeddableB.java rename to module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/scan/b/EmbeddableB.java index 8d5b71ce7cf..0f55da1e2ff 100644 --- a/core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain/scan/b/EmbeddableB.java +++ b/module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/scan/b/EmbeddableB.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.autoconfigure.domain.scan.b; +package org.springframework.boot.persistence.autoconfigure.scan.b; import jakarta.persistence.Embeddable; diff --git a/core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain/scan/b/EntityB.java b/module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/scan/b/EntityB.java similarity index 91% rename from core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain/scan/b/EntityB.java rename to module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/scan/b/EntityB.java index 6b56b1412c0..f517e6e2822 100644 --- a/core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain/scan/b/EntityB.java +++ b/module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/scan/b/EntityB.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.autoconfigure.domain.scan.b; +package org.springframework.boot.persistence.autoconfigure.scan.b; import jakarta.persistence.Entity; diff --git a/core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain/scan/c/EmbeddableC.java b/module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/scan/c/EmbeddableC.java similarity index 91% rename from core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain/scan/c/EmbeddableC.java rename to module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/scan/c/EmbeddableC.java index d72aeade9f4..e7692ea5268 100644 --- a/core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain/scan/c/EmbeddableC.java +++ b/module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/scan/c/EmbeddableC.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.autoconfigure.domain.scan.c; +package org.springframework.boot.persistence.autoconfigure.scan.c; import jakarta.persistence.Embeddable; diff --git a/core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain/scan/c/EntityC.java b/module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/scan/c/EntityC.java similarity index 91% rename from core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain/scan/c/EntityC.java rename to module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/scan/c/EntityC.java index f4e5e7a0d57..669374dfa42 100644 --- a/core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/domain/scan/c/EntityC.java +++ b/module/spring-boot-persistence/src/test/java/org/springframework/boot/persistence/autoconfigure/scan/c/EntityC.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.boot.autoconfigure.domain.scan.c; +package org.springframework.boot.persistence.autoconfigure.scan.c; import jakarta.persistence.Entity; diff --git a/module/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/ExampleTestConfig.java b/module/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/ExampleTestConfig.java index ea958ffd987..272d23990fe 100644 --- a/module/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/ExampleTestConfig.java +++ b/module/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/ExampleTestConfig.java @@ -16,7 +16,7 @@ package org.springframework.boot.test.autoconfigure; -import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.boot.persistence.autoconfigure.EntityScan; import org.springframework.boot.test.context.TestConfiguration; /** diff --git a/module/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/cache/ImportsContextCustomizerFactoryWithAutoConfigurationTests.java b/module/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/cache/ImportsContextCustomizerFactoryWithAutoConfigurationTests.java index ad8c62fcf20..891d304955c 100644 --- a/module/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/cache/ImportsContextCustomizerFactoryWithAutoConfigurationTests.java +++ b/module/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/cache/ImportsContextCustomizerFactoryWithAutoConfigurationTests.java @@ -29,7 +29,7 @@ import org.junit.platform.launcher.core.LauncherFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfigurationPackage; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; -import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.boot.persistence.autoconfigure.EntityScan; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.boot.test.autoconfigure.orm.jpa.ExampleEntity; import org.springframework.context.ApplicationContext; diff --git a/module/spring-boot-tx/build.gradle b/module/spring-boot-tx/build.gradle index d536cfb4386..e2f976ba4de 100644 --- a/module/spring-boot-tx/build.gradle +++ b/module/spring-boot-tx/build.gradle @@ -26,6 +26,7 @@ description = "Spring Boot Transaction" dependencies { api(project(":core:spring-boot")) + api(project(":module:spring-boot-persistence")) api("org.springframework:spring-tx") optional(project(":core:spring-boot-autoconfigure")) @@ -36,11 +37,8 @@ dependencies { testImplementation(project(":test-support:spring-boot-test-support")) testImplementation("com.github.h-thurow:simple-jndi") testImplementation("com.zaxxer:HikariCP") - testImplementation("jakarta.persistence:jakarta.persistence-api") - testImplementation("org.hibernate.orm:hibernate-core") testImplementation("org.hsqldb:hsqldb") testImplementation("org.springframework:spring-jdbc") - testImplementation("org.springframework:spring-orm") testRuntimeOnly(project(":module:spring-boot-reactor")) testRuntimeOnly("ch.qos.logback:logback-classic") diff --git a/module/spring-boot-tx/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/module/spring-boot-tx/src/main/resources/META-INF/additional-spring-configuration-metadata.json index eff1f2bb286..5450fa55226 100644 --- a/module/spring-boot-tx/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/module/spring-boot-tx/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -1,11 +1,5 @@ { "properties": [ - { - "name": "spring.dao.exceptiontranslation.enabled", - "type": "java.lang.Boolean", - "description": "Whether to enable the PersistenceExceptionTranslationPostProcessor.", - "defaultValue": true - }, { "name": "spring.jta.enabled", "type": "java.lang.Boolean", diff --git a/module/spring-boot-tx/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/module/spring-boot-tx/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index c5b3ed79eee..13f420e5c76 100644 --- a/module/spring-boot-tx/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/module/spring-boot-tx/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1,4 +1,3 @@ -org.springframework.boot.transaction.autoconfigure.PersistenceExceptionTranslationAutoConfiguration org.springframework.boot.transaction.autoconfigure.TransactionAutoConfiguration org.springframework.boot.transaction.autoconfigure.TransactionManagerCustomizationAutoConfiguration org.springframework.boot.transaction.jta.autoconfigure.JtaAutoConfiguration diff --git a/settings.gradle b/settings.gradle index c4ebed95f22..9b13448c9f8 100644 --- a/settings.gradle +++ b/settings.gradle @@ -138,6 +138,7 @@ include "module:spring-boot-mustache" include "module:spring-boot-neo4j" include "module:spring-boot-netty" include "module:spring-boot-opentelemetry" +include "module:spring-boot-persistence" include "module:spring-boot-pulsar" include "module:spring-boot-quartz" include "module:spring-boot-r2dbc"