diff --git a/persistence-modules/atomikos/pom.xml b/persistence-modules/atomikos/pom.xml index c1748f7dac..b535ff4dcc 100644 --- a/persistence-modules/atomikos/pom.xml +++ b/persistence-modules/atomikos/pom.xml @@ -18,6 +18,12 @@ transactions-jdbc ${atomikos-version} + + com.atomikos + transactions-jta + ${atomikos-version} + jakarta + com.atomikos transactions-jms @@ -90,10 +96,10 @@ - 5.0.6 - 5.1.6.RELEASE - 5.4.3.Final - 1.11.23.RELEASE + 6.0.0 + 6.1.2 + 6.4.2.Final + 3.2.2 5.7.0 10.8.1.2 1.1 diff --git a/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/config/Config.java b/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/config/Config.java index c6ef83c4ca..1aee108308 100644 --- a/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/config/Config.java +++ b/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/config/Config.java @@ -1,17 +1,14 @@ package com.baeldung.atomikos.spring.config; -import java.util.Properties; - -import javax.transaction.SystemException; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.transaction.annotation.EnableTransactionManagement; -import org.springframework.transaction.jta.JtaTransactionManager; - import com.atomikos.icatch.jta.UserTransactionManager; import com.atomikos.jdbc.AtomikosDataSourceBean; import com.baeldung.atomikos.spring.Application; +import jakarta.transaction.SystemException; +import java.util.Properties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.transaction.jta.JtaTransactionManager; @Configuration @EnableTransactionManagement @@ -46,7 +43,7 @@ public class Config { } @Bean(initMethod = "init", destroyMethod = "close") - public UserTransactionManager userTransactionManager() throws SystemException { + public UserTransactionManager userTransactionManager() throws jakarta.transaction.SystemException { UserTransactionManager userTransactionManager = new UserTransactionManager(); userTransactionManager.setTransactionTimeout(300); userTransactionManager.setForceShutdown(true); diff --git a/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/Application.java b/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/Application.java index ad828bd2ca..434dd24e4a 100644 --- a/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/Application.java +++ b/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/Application.java @@ -29,13 +29,13 @@ public class Application { String orderId = UUID.randomUUID() .toString(); - Inventory inventory = inventoryRepository.findOne(productId); + Inventory inventory = inventoryRepository.getReferenceById(productId); inventory.setBalance(inventory.getBalance() - amount); inventoryRepository.save(inventory); Order order = new Order(); order.setOrderId(orderId); order.setProductId(productId); - order.setAmount(new Long(amount)); + order.setAmount( Long.valueOf(amount)); ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator(); Set> violations = validator.validate(order); diff --git a/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/config/Config.java b/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/config/Config.java index 6716f19576..6ebf3aea8f 100644 --- a/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/config/Config.java +++ b/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/config/Config.java @@ -1,6 +1,6 @@ package com.baeldung.atomikos.spring.jpa.config; -import javax.transaction.SystemException; +import jakarta.transaction.SystemException; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/Inventory.java b/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/Inventory.java index 999879218c..f23c307fea 100644 --- a/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/Inventory.java +++ b/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/Inventory.java @@ -1,8 +1,8 @@ package com.baeldung.atomikos.spring.jpa.inventory; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; @Entity @Table(name = "INVENTORY") diff --git a/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/InventoryConfig.java b/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/InventoryConfig.java index 5301ad6ff2..6b05c380d0 100644 --- a/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/InventoryConfig.java +++ b/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/inventory/InventoryConfig.java @@ -2,7 +2,7 @@ package com.baeldung.atomikos.spring.jpa.inventory; import java.util.Properties; -import javax.persistence.EntityManagerFactory; +import jakarta.persistence.EntityManagerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/Order.java b/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/Order.java index 3a580e6448..18980e31d4 100644 --- a/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/Order.java +++ b/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/Order.java @@ -1,8 +1,8 @@ package com.baeldung.atomikos.spring.jpa.order; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import jakarta.validation.constraints.Max; @Entity diff --git a/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/OrderConfig.java b/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/OrderConfig.java index b4274bb64c..431cfffe49 100644 --- a/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/OrderConfig.java +++ b/persistence-modules/atomikos/src/main/java/com/baeldung/atomikos/spring/jpa/order/OrderConfig.java @@ -2,7 +2,7 @@ package com.baeldung.atomikos.spring.jpa.order; import java.util.Properties; -import javax.persistence.EntityManagerFactory; +import jakarta.persistence.EntityManagerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/persistence-modules/atomikos/src/test/java/com/baeldung/atomikos/spring/jpa/ApplicationUnitTest.java b/persistence-modules/atomikos/src/test/java/com/baeldung/atomikos/spring/jpa/ApplicationUnitTest.java index e6a3c1982c..b1c426f83a 100644 --- a/persistence-modules/atomikos/src/test/java/com/baeldung/atomikos/spring/jpa/ApplicationUnitTest.java +++ b/persistence-modules/atomikos/src/test/java/com/baeldung/atomikos/spring/jpa/ApplicationUnitTest.java @@ -72,7 +72,7 @@ public class ApplicationUnitTest { private static long getBalance(InventoryRepository inventoryRepository, String productId) throws Exception { - return inventoryRepository.findOne(productId) + return inventoryRepository.getReferenceById(productId) .getBalance(); } diff --git a/persistence-modules/hibernate-enterprise/pom.xml b/persistence-modules/hibernate-enterprise/pom.xml index caf7b37a41..f5c165b10c 100644 --- a/persistence-modules/hibernate-enterprise/pom.xml +++ b/persistence-modules/hibernate-enterprise/pom.xml @@ -15,7 +15,7 @@ - org.hibernate + org.hibernate.orm hibernate-core ${hibernate.version} @@ -25,7 +25,7 @@ ${h2.version} - org.hibernate + org.hibernate.orm hibernate-spatial ${hibernate.version} @@ -45,7 +45,7 @@ ${mariaDB4j.version} - org.hibernate + org.hibernate.orm hibernate-testing ${hibernate.version} @@ -82,6 +82,7 @@ 8.2.0 2.6.0 0.9 + 6.4.2.Final \ No newline at end of file diff --git a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java index 37c21d1899..2b711b9418 100644 --- a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java +++ b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/exception/HibernateExceptionUnitTest.java @@ -9,12 +9,16 @@ import java.util.List; import jakarta.persistence.OptimisticLockException; import jakarta.persistence.PersistenceException; +import org.h2.jdbc.JdbcSQLDataException; +import org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException; +import org.h2.jdbc.JdbcSQLSyntaxErrorException; import org.hibernate.HibernateException; import org.hibernate.MappingException; import org.hibernate.NonUniqueObjectException; import org.hibernate.PropertyValueException; import org.hibernate.Session; import org.hibernate.SessionFactory; +import org.hibernate.StaleObjectStateException; import org.hibernate.StaleStateException; import org.hibernate.Transaction; import org.hibernate.cfg.AvailableSettings; @@ -132,8 +136,8 @@ public class HibernateExceptionUnitTest { @Test public void givenMissingTable_whenEntitySaved_thenSQLGrammarException() { - thrown.expectCause(isA(SQLGrammarException.class)); - thrown.expectMessage("could not prepare statement"); + thrown.expectCause(isA(JdbcSQLSyntaxErrorException.class)); + thrown.expectMessage("Table \"PRODUCT\" not found (this database is empty); SQL statement"); Configuration cfg = getConfiguration(); cfg.addAnnotatedClass(Product.class); @@ -161,8 +165,8 @@ public class HibernateExceptionUnitTest { @Test public void givenMissingTable_whenQueryExecuted_thenSQLGrammarException() { - thrown.expectCause(isA(SQLGrammarException.class)); - thrown.expectMessage("could not prepare statement"); + thrown.expectCause(isA(JdbcSQLSyntaxErrorException.class)); + thrown.expectMessage("Table \"NON_EXISTING_TABLE\" not found"); Session session = sessionFactory.openSession(); NativeQuery query = session.createNativeQuery("select * from NON_EXISTING_TABLE", Product.class); @@ -171,7 +175,7 @@ public class HibernateExceptionUnitTest { @Test public void whenDuplicateIdSaved_thenConstraintViolationException() { - thrown.expectCause(isA(ConstraintViolationException.class)); + thrown.expectCause(isA(JdbcSQLIntegrityConstraintViolationException.class)); thrown.expectMessage("could not execute statement"); Session session = null; @@ -224,7 +228,7 @@ public class HibernateExceptionUnitTest { public void givenEntityWithoutId_whenCallingSave_thenThrowIdentifierGenerationException() { thrown.expect(isA(IdentifierGenerationException.class)); - thrown.expectMessage("ids for this class must be manually assigned before calling save(): com.baeldung.hibernate.exception.Product"); + thrown.expectMessage("Identifier of entity 'com.baeldung.hibernate.exception.ProductEntity' must be manually assigned before calling 'persist()"); Session session = null; Transaction transaction = null; @@ -249,8 +253,8 @@ public class HibernateExceptionUnitTest { @Test public void givenQueryWithDataTypeMismatch_WhenQueryExecuted_thenDataException() { - thrown.expectCause(isA(DataException.class)); - thrown.expectMessage("could not prepare statement"); + thrown.expectCause(isA(JdbcSQLDataException.class)); + thrown.expectMessage("Data conversion error converting \"wrongTypeId\""); Session session = sessionFactory.openSession(); NativeQuery query = session.createNativeQuery("select * from PRODUCT where id='wrongTypeId'", Product.class); @@ -291,7 +295,7 @@ public class HibernateExceptionUnitTest { @Test public void whenDeletingADeletedObject_thenOptimisticLockException() { thrown.expect(isA(OptimisticLockException.class)); - thrown.expectMessage("Batch update returned unexpected row count from update"); + thrown.expectMessage("Row was updated or deleted by another transaction"); thrown.expectCause(isA(StaleStateException.class)); Session session = null; @@ -327,8 +331,8 @@ public class HibernateExceptionUnitTest { @Test public void whenUpdatingNonExistingObject_thenStaleStateException() { - thrown.expectCause(isA(StaleStateException.class)); - thrown.expectMessage("Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; statement executed: update PRODUCT set description=?, name=? where id=?"); + thrown.expectCause(isA(StaleObjectStateException.class)); + thrown.expectMessage("Row was updated or deleted by another transaction"); Session session = null; Transaction transaction = null; @@ -409,9 +413,7 @@ public class HibernateExceptionUnitTest { @Test public void givenExistingEntity_whenIdUpdated_thenHibernateException() { - thrown.expect(isA(PersistenceException.class)); - thrown.expectCause(isA(HibernateException.class)); - thrown.expectMessage("identifier of an instance of com.baeldung.hibernate.exception.Product was altered"); + thrown.expect(isA(HibernateException.class)); Session session = null; Transaction transaction = null; diff --git a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/MapMultiTenantConnectionProvider.java b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/MapMultiTenantConnectionProvider.java index 47abf6ff85..8458eefaeb 100644 --- a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/MapMultiTenantConnectionProvider.java +++ b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/database/MapMultiTenantConnectionProvider.java @@ -10,7 +10,7 @@ import org.hibernate.engine.jdbc.connections.spi.AbstractMultiTenantConnectionPr import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; @SuppressWarnings("serial") -public class MapMultiTenantConnectionProvider extends AbstractMultiTenantConnectionProvider { +public class MapMultiTenantConnectionProvider extends AbstractMultiTenantConnectionProvider { private final Map connectionProviderMap = new HashMap<>(); @@ -26,6 +26,7 @@ public class MapMultiTenantConnectionProvider extends AbstractMultiTenantConnect .next(); } + @Override protected ConnectionProvider selectConnectionProvider(String tenantIdentifier) { return connectionProviderMap.get(tenantIdentifier); diff --git a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaMultiTenantConnectionProvider.java b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaMultiTenantConnectionProvider.java index 67b838fdf1..aecfa23d0a 100644 --- a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaMultiTenantConnectionProvider.java +++ b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaMultiTenantConnectionProvider.java @@ -12,7 +12,7 @@ import org.hibernate.engine.jdbc.connections.spi.AbstractMultiTenantConnectionPr import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; @SuppressWarnings("serial") -public class SchemaMultiTenantConnectionProvider extends AbstractMultiTenantConnectionProvider { +public class SchemaMultiTenantConnectionProvider extends AbstractMultiTenantConnectionProvider { private final ConnectionProvider connectionProvider; diff --git a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/persistence/save/SaveMethodsIntegrationTest.java b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/persistence/save/SaveMethodsIntegrationTest.java index c3d2362339..921459ac46 100644 --- a/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/persistence/save/SaveMethodsIntegrationTest.java +++ b/persistence-modules/hibernate-enterprise/src/test/java/com/baeldung/persistence/save/SaveMethodsIntegrationTest.java @@ -179,7 +179,7 @@ public class SaveMethodsIntegrationTest { .commit(); session.beginTransaction(); - assertNull(person.getId()); + assertNotNull(person.getId()); assertNotNull(mergedPerson.getId()); } diff --git a/persistence-modules/hibernate-exceptions/pom.xml b/persistence-modules/hibernate-exceptions/pom.xml index 670ff4cdb8..7ab0308bd9 100644 --- a/persistence-modules/hibernate-exceptions/pom.xml +++ b/persistence-modules/hibernate-exceptions/pom.xml @@ -20,7 +20,7 @@ ${hsqldb.version} - org.hibernate + org.hibernate.orm hibernate-core ${hibernate.version} @@ -34,6 +34,7 @@ 2.7.1 2.1.214 + 6.4.2.Final \ No newline at end of file diff --git a/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/transientobject/entity/Author.java b/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/transientobject/entity/Author.java index 271e810002..e882083a70 100644 --- a/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/transientobject/entity/Author.java +++ b/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/transientobject/entity/Author.java @@ -26,9 +26,8 @@ public class Author { @Column(name = "name") private String name; - @ManyToMany @Cascade({ CascadeType.SAVE_UPDATE, CascadeType.MERGE, CascadeType.PERSIST}) - @JoinColumn(name = "book_id") + @ManyToMany(mappedBy = "authors") private Set books = new HashSet<>(); public void addBook(Book book) { diff --git a/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/transientobject/entity/Book.java b/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/transientobject/entity/Book.java index 0734cccff1..6034455370 100644 --- a/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/transientobject/entity/Book.java +++ b/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/transientobject/entity/Book.java @@ -1,6 +1,7 @@ package com.baeldung.hibernate.exception.transientobject.entity; +import jakarta.persistence.JoinTable; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.CascadeType; @@ -29,7 +30,7 @@ public class Book { @ManyToMany @Cascade({ CascadeType.SAVE_UPDATE, CascadeType.MERGE, CascadeType.PERSIST}) - @JoinColumn(name = "author_id") + @JoinTable(joinColumns = { @JoinColumn(name = "author_id") }) private Set authors = new HashSet<>(); public void addAuthor(Author author) { diff --git a/persistence-modules/hibernate-exceptions/src/test/java/com/baeldung/hibernate/namedparameternotbound/NamedParameterNotBoundExceptionUnitTest.java b/persistence-modules/hibernate-exceptions/src/test/java/com/baeldung/hibernate/namedparameternotbound/NamedParameterNotBoundExceptionUnitTest.java index f16a89917d..82788ce562 100644 --- a/persistence-modules/hibernate-exceptions/src/test/java/com/baeldung/hibernate/namedparameternotbound/NamedParameterNotBoundExceptionUnitTest.java +++ b/persistence-modules/hibernate-exceptions/src/test/java/com/baeldung/hibernate/namedparameternotbound/NamedParameterNotBoundExceptionUnitTest.java @@ -44,7 +44,7 @@ class NamedParameterNotBoundExceptionUnitTest { query.list(); }); - String expectedMessage = "Named parameter not bound"; + String expectedMessage = "No argument for named parameter"; String actualMessage = exception.getMessage(); assertTrue(actualMessage.contains(expectedMessage)); diff --git a/persistence-modules/hibernate-jpa/pom.xml b/persistence-modules/hibernate-jpa/pom.xml index 603c749e95..b18ed85b41 100644 --- a/persistence-modules/hibernate-jpa/pom.xml +++ b/persistence-modules/hibernate-jpa/pom.xml @@ -15,7 +15,7 @@ - org.hibernate + org.hibernate.orm hibernate-core ${hibernate.version} @@ -84,6 +84,7 @@ 8.2.0 + 6.4.2.Final 2.6.0 3.0.4 2.1.214 diff --git a/persistence-modules/spring-data-jpa-repo-2/pom.xml b/persistence-modules/spring-data-jpa-repo-2/pom.xml index e39458449c..12519088b5 100644 --- a/persistence-modules/spring-data-jpa-repo-2/pom.xml +++ b/persistence-modules/spring-data-jpa-repo-2/pom.xml @@ -8,9 +8,9 @@ com.baeldung - parent-boot-2 + parent-boot-3 0.0.1-SNAPSHOT - ../../parent-boot-2 + ../../parent-boot-3 @@ -19,8 +19,9 @@ spring-boot-starter-web - javax.persistence - javax.persistence-api + jakarta.persistence + jakarta.persistence-api + ${jakarta.persistence.version} org.springframework.data @@ -29,6 +30,16 @@ org.springframework.boot spring-boot-starter-data-jpa + + + com.querydsl + querydsl-jpa + + + com.querydsl + querydsl-apt + + com.h2database @@ -36,33 +47,21 @@ com.querydsl - querydsl-apt + querydsl-jpa + jakarta + ${querydsl.version} com.querydsl - querydsl-jpa + querydsl-apt + jakarta + ${querydsl.version} + provided - - com.mysema.maven - apt-maven-plugin - 1.1.3 - - - generate-sources - - process - - - ${project.build.directory}/generated-sources - com.querydsl.apt.jpa.JPAAnnotationProcessor - - - - org.bsc.maven maven-processor-plugin @@ -86,11 +85,21 @@ org.hibernate hibernate-jpamodelgen - 5.6.11.Final + ${hibernate-jpamodelgen.version} + + 17 + 17 + 5.0.0 + 3.1.0 + 1.1.3 + true + 6.4.2.Final + + \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/customrepository/model/User.java b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/customrepository/model/User.java index ba217577f3..13325e3dbd 100644 --- a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/customrepository/model/User.java +++ b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/customrepository/model/User.java @@ -1,8 +1,8 @@ package com.baeldung.spring.data.persistence.customrepository.model; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; import java.util.Objects; @Entity diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/customrepository/repository/CustomUserRepositoryImpl.java b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/customrepository/repository/CustomUserRepositoryImpl.java index dc006580c1..e9c8ea98ee 100644 --- a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/customrepository/repository/CustomUserRepositoryImpl.java +++ b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/customrepository/repository/CustomUserRepositoryImpl.java @@ -2,9 +2,9 @@ package com.baeldung.spring.data.persistence.customrepository.repository; import com.baeldung.spring.data.persistence.customrepository.model.User; -import javax.annotation.PostConstruct; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; +import jakarta.annotation.PostConstruct; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import java.util.Objects; public class CustomUserRepositoryImpl implements CustomUserRepository { diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/findbyvsfindallby/model/Player.java b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/findbyvsfindallby/model/Player.java index 0d8f833b4c..2579472d03 100644 --- a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/findbyvsfindallby/model/Player.java +++ b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/findbyvsfindallby/model/Player.java @@ -1,9 +1,9 @@ package com.baeldung.spring.data.persistence.findbyvsfindallby.model; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; import java.util.Objects; @Entity diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/saveperformance/Book.java b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/saveperformance/Book.java index b6abdd2ed5..8199d59e39 100644 --- a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/saveperformance/Book.java +++ b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/saveperformance/Book.java @@ -1,9 +1,9 @@ package com.baeldung.spring.data.persistence.saveperformance; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; @Entity public class Book { diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/search/Student.java b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/search/Student.java index 1d6eaa3b33..fed1ff228e 100644 --- a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/search/Student.java +++ b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/search/Student.java @@ -2,10 +2,10 @@ package com.baeldung.spring.data.persistence.search; import java.util.Objects; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; @Entity public class Student { diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/model/Employee.java b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/model/Employee.java index 9690bcf68a..284771a8c9 100644 --- a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/model/Employee.java +++ b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/model/Employee.java @@ -3,13 +3,13 @@ package com.baeldung.spring.data.persistence.springdatajpadifference.model; import java.io.Serializable; import java.util.Objects; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.NamedQuery; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.Table; @Entity @Table(name = "employee") diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/springdata/config/SpringDataJpaConfig.java b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/springdata/config/SpringDataJpaConfig.java index 923e923c88..23c7b30470 100644 --- a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/springdata/config/SpringDataJpaConfig.java +++ b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/springdata/config/SpringDataJpaConfig.java @@ -2,7 +2,7 @@ package com.baeldung.spring.data.persistence.springdatajpadifference.springdata. import java.util.Properties; -import javax.persistence.EntityManager; +import jakarta.persistence.EntityManager; import javax.sql.DataSource; import org.springframework.boot.jdbc.DataSourceBuilder; diff --git a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/springdata/repository/EmployeeRepositoryPagingAndSort.java b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/springdata/repository/EmployeeRepositoryPagingAndSort.java index 731735ea62..e5019ddf42 100644 --- a/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/springdata/repository/EmployeeRepositoryPagingAndSort.java +++ b/persistence-modules/spring-data-jpa-repo-2/src/main/java/com/baeldung/spring/data/persistence/springdatajpadifference/springdata/repository/EmployeeRepositoryPagingAndSort.java @@ -1,11 +1,11 @@ package com.baeldung.spring.data.persistence.springdatajpadifference.springdata.repository; -import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.baeldung.spring.data.persistence.springdatajpadifference.model.Employee; @Repository -public interface EmployeeRepositoryPagingAndSort extends PagingAndSortingRepository { +public interface EmployeeRepositoryPagingAndSort extends JpaRepository { } \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/search/StudentApplicationUnitTest.java b/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/search/StudentApplicationUnitTest.java index ea16b3597d..4e1c09e0e1 100644 --- a/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/search/StudentApplicationUnitTest.java +++ b/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/search/StudentApplicationUnitTest.java @@ -13,8 +13,6 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.domain.Sort; diff --git a/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/springdatajpadifference/JpaDaoIntegrationTest.java b/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/springdatajpadifference/JpaDaoIntegrationTest.java index b25038f175..b31fd3c182 100644 --- a/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/springdatajpadifference/JpaDaoIntegrationTest.java +++ b/persistence-modules/spring-data-jpa-repo-2/src/test/java/com/baeldung/spring/data/persistence/springdatajpadifference/JpaDaoIntegrationTest.java @@ -7,15 +7,15 @@ import static org.junit.Assert.assertNull; import java.util.Arrays; import java.util.List; -import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; -import javax.persistence.Persistence; -import javax.persistence.Query; -import javax.persistence.TypedQuery; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.CriteriaUpdate; -import javax.persistence.criteria.Root; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.Persistence; +import jakarta.persistence.Query; +import jakarta.persistence.TypedQuery; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.CriteriaUpdate; +import jakarta.persistence.criteria.Root; import org.junit.Before; import org.junit.Test; diff --git a/pom.xml b/pom.xml index a02bd85d3f..fe201fee89 100644 --- a/pom.xml +++ b/pom.xml @@ -1194,8 +1194,8 @@ 3.1.0 1.8 1.2.17 - 1.36 - 1.36 + 1.37 + 1.37 3.1.2 4.4 2.13.0 diff --git a/spring-security-modules/spring-security-acl/pom.xml b/spring-security-modules/spring-security-acl/pom.xml index 734b85800a..4feea8fb96 100644 --- a/spring-security-modules/spring-security-acl/pom.xml +++ b/spring-security-modules/spring-security-acl/pom.xml @@ -11,7 +11,8 @@ com.baeldung - spring-security-modules + parent-boot-3 + ../../parent-boot-3 0.0.1-SNAPSHOT @@ -46,16 +47,6 @@ org.springframework spring-context-support - - net.sf.ehcache - ehcache-core - ${ehcache-core.version} - jar - - - 2.6.11 - - \ No newline at end of file diff --git a/spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/config/ACLContext.java b/spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/config/ACLContext.java index cb60ef1d45..186cadbb63 100644 --- a/spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/config/ACLContext.java +++ b/spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/config/ACLContext.java @@ -4,8 +4,7 @@ import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.cache.ehcache.EhCacheFactoryBean; -import org.springframework.cache.ehcache.EhCacheManagerFactoryBean; +import org.springframework.cache.concurrent.ConcurrentMapCache; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler; @@ -16,7 +15,7 @@ import org.springframework.security.acls.domain.AclAuthorizationStrategy; import org.springframework.security.acls.domain.AclAuthorizationStrategyImpl; import org.springframework.security.acls.domain.ConsoleAuditLogger; import org.springframework.security.acls.domain.DefaultPermissionGrantingStrategy; -import org.springframework.security.acls.domain.EhCacheBasedAclCache; +import org.springframework.security.acls.domain.SpringCacheBasedAclCache; import org.springframework.security.acls.jdbc.BasicLookupStrategy; import org.springframework.security.acls.jdbc.JdbcMutableAclService; import org.springframework.security.acls.jdbc.LookupStrategy; @@ -31,21 +30,9 @@ public class ACLContext { DataSource dataSource; @Bean - public EhCacheBasedAclCache aclCache() { - return new EhCacheBasedAclCache(aclEhCacheFactoryBean().getObject(), permissionGrantingStrategy(), aclAuthorizationStrategy()); - } - - @Bean - public EhCacheFactoryBean aclEhCacheFactoryBean() { - EhCacheFactoryBean ehCacheFactoryBean = new EhCacheFactoryBean(); - ehCacheFactoryBean.setCacheManager(aclCacheManager().getObject()); - ehCacheFactoryBean.setCacheName("aclCache"); - return ehCacheFactoryBean; - } - - @Bean - public EhCacheManagerFactoryBean aclCacheManager() { - return new EhCacheManagerFactoryBean(); + public SpringCacheBasedAclCache aclCache() { + final ConcurrentMapCache aclCache = new ConcurrentMapCache("acl_cache"); + return new SpringCacheBasedAclCache(aclCache, permissionGrantingStrategy(), aclAuthorizationStrategy()); } @Bean diff --git a/spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/persistence/entity/NoticeMessage.java b/spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/persistence/entity/NoticeMessage.java index 80c04146e4..c1de3112bf 100644 --- a/spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/persistence/entity/NoticeMessage.java +++ b/spring-security-modules/spring-security-acl/src/main/java/com/baeldung/acl/persistence/entity/NoticeMessage.java @@ -1,9 +1,9 @@ package com.baeldung.acl.persistence.entity; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; @Entity @Table(name="system_message") diff --git a/spring-security-modules/spring-security-acl/src/main/resources/acl-data.sql b/spring-security-modules/spring-security-acl/src/main/resources/acl-data.sql index 3b48c83f3c..f4c443961c 100644 --- a/spring-security-modules/spring-security-acl/src/main/resources/acl-data.sql +++ b/spring-security-modules/spring-security-acl/src/main/resources/acl-data.sql @@ -1,7 +1,7 @@ -INSERT INTO acl_sid (id, principal, sid) VALUES -(1, 1, 'manager'), -(2, 1, 'hr'), -(3, 0, 'ROLE_EDITOR'); +INSERT INTO acl_sid (principal, sid) VALUES +(1, 'manager'), +(1, 'hr'), +(0, 'ROLE_EDITOR'); INSERT INTO acl_class (id, class) VALUES (1, 'com.baeldung.acl.persistence.entity.NoticeMessage'); @@ -11,16 +11,16 @@ INSERT INTO system_message(id,content) VALUES (2,'Second Level Message'), (3,'Third Level Message'); -INSERT INTO acl_object_identity (id, object_id_class, object_id_identity, parent_object, owner_sid, entries_inheriting) VALUES -(1, 1, 1, NULL, 3, 0), -(2, 1, 2, NULL, 3, 0), -(3, 1, 3, NULL, 3, 0); +INSERT INTO acl_object_identity (object_id_class, object_id_identity, parent_object, owner_sid, entries_inheriting) VALUES +(1, 1, NULL, 3, 0), +(1, 2, NULL, 3, 0), +(1, 3, NULL, 3, 0); -INSERT INTO acl_entry (id, acl_object_identity, ace_order, sid, mask, granting, audit_success, audit_failure) VALUES -(1, 1, 1, 1, 1, 1, 1, 1), -(2, 1, 2, 1, 2, 1, 1, 1), -(3, 1, 3, 3, 1, 1, 1, 1), -(4, 2, 1, 2, 1, 1, 1, 1), -(5, 2, 2, 3, 1, 1, 1, 1), -(6, 3, 1, 3, 1, 1, 1, 1), -(7, 3, 2, 3, 2, 1, 1, 1); \ No newline at end of file +INSERT INTO acl_entry (acl_object_identity, ace_order, sid, mask, granting, audit_success, audit_failure) VALUES +(1, 1, 1, 1, 1, 1, 1), +(1, 2, 1, 2, 1, 1, 1), +(1, 3, 3, 1, 1, 1, 1), +(2, 1, 2, 1, 1, 1, 1), +(2, 2, 3, 1, 1, 1, 1), +(3, 1, 3, 1, 1, 1, 1), +(3, 2, 3, 2, 1, 1, 1); \ No newline at end of file diff --git a/spring-security-modules/spring-security-acl/src/test/java/com/baeldung/SpringContextTest.java b/spring-security-modules/spring-security-acl/src/test/java/com/baeldung/SpringContextTest.java index e60983733e..fa8ad73a80 100644 --- a/spring-security-modules/spring-security-acl/src/test/java/com/baeldung/SpringContextTest.java +++ b/spring-security-modules/spring-security-acl/src/test/java/com/baeldung/SpringContextTest.java @@ -4,10 +4,12 @@ import com.baeldung.acl.Application; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) +@DirtiesContext public class SpringContextTest { @Test diff --git a/spring-security-modules/spring-security-cognito/pom.xml b/spring-security-modules/spring-security-cognito/pom.xml index 2e359382a7..130c482c82 100644 --- a/spring-security-modules/spring-security-cognito/pom.xml +++ b/spring-security-modules/spring-security-cognito/pom.xml @@ -11,7 +11,8 @@ com.baeldung - spring-security-modules + parent-boot-3 + ../../parent-boot-3 0.0.1-SNAPSHOT @@ -30,7 +31,7 @@ org.thymeleaf.extras - thymeleaf-extras-springsecurity5 + thymeleaf-extras-springsecurity6 diff --git a/spring-security-modules/spring-security-cognito/src/main/java/com/baeldung/cognito/SecurityConfiguration.java b/spring-security-modules/spring-security-cognito/src/main/java/com/baeldung/cognito/SecurityConfiguration.java index 62cdd7c73c..7385aef78b 100644 --- a/spring-security-modules/spring-security-cognito/src/main/java/com/baeldung/cognito/SecurityConfiguration.java +++ b/spring-security-modules/spring-security-cognito/src/main/java/com/baeldung/cognito/SecurityConfiguration.java @@ -2,6 +2,7 @@ package com.baeldung.cognito; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.web.SecurityFilterChain; @@ -10,16 +11,13 @@ public class SecurityConfiguration { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - http.csrf() - .and() - .authorizeRequests(authz -> authz.mvcMatchers("/") + http.csrf(Customizer.withDefaults()) + .authorizeHttpRequests(authz -> authz.requestMatchers("/") .permitAll() .anyRequest() .authenticated()) - .oauth2Login() - .and() - .logout() - .logoutSuccessUrl("/"); + .oauth2Login(Customizer.withDefaults()) + .logout(httpSecurityLogoutConfigurer -> httpSecurityLogoutConfigurer.logoutSuccessUrl("/")); return http.build(); } } \ No newline at end of file diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/auditing/ExposeAttemptedPathAuthorizationAuditListener.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/auditing/ExposeAttemptedPathAuthorizationAuditListener.java index ff53b3cc6a..0f966709b9 100644 --- a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/auditing/ExposeAttemptedPathAuthorizationAuditListener.java +++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/auditing/ExposeAttemptedPathAuthorizationAuditListener.java @@ -19,13 +19,13 @@ public class ExposeAttemptedPathAuthorizationAuditListener extends AbstractAutho @Override public void onApplicationEvent(AuthorizationEvent event) { if (event instanceof AuthorizationDeniedEvent) { - onAuthorizationFailureEvent((AuthorizationDeniedEvent) event); + onAuthorizationFailureEvent(event); } } - private void onAuthorizationFailureEvent(AuthorizationDeniedEvent event) { + private void onAuthorizationFailureEvent(AuthorizationEvent event) { String name = this.getName(event.getAuthentication()); - Map data = new LinkedHashMap(); + Map data = new LinkedHashMap<>(); Object details = this.getDetails(event.getAuthentication()); if (details != null) { data.put("details", details); diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/config/WebSecurityConfig.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/config/WebSecurityConfig.java index 24f7dc8a5b..dc6f636715 100644 --- a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/config/WebSecurityConfig.java +++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/config/WebSecurityConfig.java @@ -3,9 +3,10 @@ package com.baeldung.app.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.Customizer; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.crypto.password.PasswordEncoder; @@ -14,7 +15,7 @@ import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity -@EnableGlobalMethodSecurity(prePostEnabled = true) +@EnableMethodSecurity public class WebSecurityConfig { @Bean @@ -25,8 +26,8 @@ public class WebSecurityConfig { .anyRequest() .authenticated()) .httpBasic(Customizer.withDefaults()) - .logout(logout -> logout.disable()) - .csrf(csrf -> csrf.disable()); + .logout(AbstractHttpConfigurer::disable) + .csrf(AbstractHttpConfigurer::disable); return http.build(); } diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/controller/TaskController.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/controller/TaskController.java index f2d479d782..217719cba6 100644 --- a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/controller/TaskController.java +++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/controller/TaskController.java @@ -6,9 +6,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping("api/tasks") @@ -20,14 +21,14 @@ public class TaskController { @Autowired(required = false) private UserDetailsService userDetailsService; - @RequestMapping(method = RequestMethod.GET) + @GetMapping public ResponseEntity> findAllTasks() { Iterable tasks = taskService.findAll(); return ResponseEntity.ok().body(tasks); } - @RequestMapping(method = RequestMethod.POST, consumes = "application/json") + @PostMapping(consumes = "application/json") public ResponseEntity> addTasks(@RequestBody Iterable newTasks) { Iterable tasks = taskService.save(newTasks); diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/filter/CustomFilter.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/filter/CustomFilter.java index c16202976b..8b47cf3f17 100644 --- a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/filter/CustomFilter.java +++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/app/filter/CustomFilter.java @@ -14,7 +14,7 @@ public class CustomFilter implements Filter { private static Logger LOGGER = LoggerFactory.getLogger(CustomFilter.class); @Override - public void init(FilterConfig config) throws ServletException { + public void init(FilterConfig config) { } @Override diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/denyonmissing/CustomPermissionAllowedMethodSecurityMetadataSource.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/denyonmissing/CustomPermissionAllowedMethodSecurityMetadataSource.java index c6508f0ab3..631987ba4d 100644 --- a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/denyonmissing/CustomPermissionAllowedMethodSecurityMetadataSource.java +++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/denyonmissing/CustomPermissionAllowedMethodSecurityMetadataSource.java @@ -2,34 +2,31 @@ package com.baeldung.denyonmissing; import static org.springframework.security.access.annotation.Jsr250SecurityConfig.DENY_ALL_ATTRIBUTE; -import java.lang.annotation.Annotation; -import java.lang.reflect.Method; import java.util.ArrayList; -import java.util.Collection; +import java.util.Collections; import java.util.List; +import java.util.function.Supplier; -import org.springframework.core.annotation.AnnotationUtils; -import org.springframework.core.annotation.MergedAnnotation; +import org.aopalliance.intercept.MethodInvocation; import org.springframework.core.annotation.MergedAnnotations; import org.springframework.security.access.ConfigAttribute; -import org.springframework.security.access.method.AbstractFallbackMethodSecurityMetadataSource; import org.springframework.security.access.prepost.PostAuthorize; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.authorization.AuthorizationDecision; +import org.springframework.security.authorization.AuthorizationManager; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Component; import org.springframework.stereotype.Controller; -public class CustomPermissionAllowedMethodSecurityMetadataSource extends AbstractFallbackMethodSecurityMetadataSource { - @Override - protected Collection findAttributes(Class clazz) { - return null; - } +@Component +public class CustomPermissionAllowedMethodSecurityMetadataSource implements AuthorizationManager { @Override - protected Collection findAttributes(Method method, Class targetClass) { - MergedAnnotations annotations = MergedAnnotations.from(method, - MergedAnnotations.SearchStrategy.DIRECT); + public AuthorizationDecision check(Supplier authentication, MethodInvocation mi) { + MergedAnnotations annotations = MergedAnnotations.from(mi.getMethod(), MergedAnnotations.SearchStrategy.DIRECT); List attributes = new ArrayList<>(); - MergedAnnotations classAnnotations = MergedAnnotations.from(targetClass, MergedAnnotations.SearchStrategy.DIRECT); + MergedAnnotations classAnnotations = MergedAnnotations.from(DenyOnMissingController.class, MergedAnnotations.SearchStrategy.DIRECT); // if the class is annotated as @Controller we should by default deny access to every method if (classAnnotations.get(Controller.class).isPresent()) { attributes.add(DENY_ALL_ATTRIBUTE); @@ -38,12 +35,6 @@ public class CustomPermissionAllowedMethodSecurityMetadataSource extends Abstrac if (annotations.get(PreAuthorize.class).isPresent() || annotations.get(PostAuthorize.class).isPresent()) { return null; } - - return attributes; - } - - @Override - public Collection getAllConfigAttributes() { - return null; + return new AuthorizationDecision(!Collections.disjoint(attributes, authentication.get().getAuthorities())); } } \ No newline at end of file diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/denyonmissing/DenyMethodSecurityConfig.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/denyonmissing/DenyMethodSecurityConfig.java index 695f81eb54..03fe2b6887 100644 --- a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/denyonmissing/DenyMethodSecurityConfig.java +++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/denyonmissing/DenyMethodSecurityConfig.java @@ -1,10 +1,12 @@ package com.baeldung.denyonmissing; +import org.springframework.aop.Advisor; +import org.springframework.aop.support.JdkRegexpMethodPointcut; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.security.access.method.MethodSecurityMetadataSource; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration; +import org.springframework.security.authorization.method.AuthorizationInterceptorsOrder; +import org.springframework.security.authorization.method.AuthorizationManagerBeforeMethodInterceptor; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetailsService; @@ -12,11 +14,16 @@ import org.springframework.security.provisioning.InMemoryUserDetailsManager; @Configuration @EnableWebSecurity -@EnableGlobalMethodSecurity(prePostEnabled = true) -public class DenyMethodSecurityConfig extends GlobalMethodSecurityConfiguration { - @Override - protected MethodSecurityMetadataSource customMethodSecurityMetadataSource() { - return new CustomPermissionAllowedMethodSecurityMetadataSource(); +@EnableMethodSecurity +public class DenyMethodSecurityConfig { + + @Bean + public Advisor preAuthorize(CustomPermissionAllowedMethodSecurityMetadataSource manager) { + JdkRegexpMethodPointcut pattern = new JdkRegexpMethodPointcut(); + pattern.setPattern("com.baeldung.denyonmissing.*"); + AuthorizationManagerBeforeMethodInterceptor interceptor = new AuthorizationManagerBeforeMethodInterceptor(pattern, manager); + interceptor.setOrder(AuthorizationInterceptorsOrder.PRE_AUTHORIZE.getOrder() - 1); + return interceptor; } @Bean diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/filterresponse/config/AppConfig.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/filterresponse/config/AppConfig.java index d57c1f2e5f..4f66c63817 100644 --- a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/filterresponse/config/AppConfig.java +++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/filterresponse/config/AppConfig.java @@ -6,6 +6,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @@ -42,7 +43,7 @@ public class AppConfig implements WebMvcConfigurer { .anyRequest() .authenticated()) .httpBasic(Customizer.withDefaults()) - .csrf(csrf -> csrf.disable()); + .csrf(AbstractHttpConfigurer::disable); return http.build(); } diff --git a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/filterresponse/model/Item.java b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/filterresponse/model/Item.java index 9ebdc6bad0..9cc35d3829 100644 --- a/spring-security-modules/spring-security-core/src/main/java/com/baeldung/filterresponse/model/Item.java +++ b/spring-security-modules/spring-security-core/src/main/java/com/baeldung/filterresponse/model/Item.java @@ -6,11 +6,11 @@ import com.fasterxml.jackson.annotation.JsonView; public class Item { @JsonView(View.User.class) - private int id; + private final int id; @JsonView(View.User.class) - private String name; + private final String name; @JsonView(View.Admin.class) - private String ownerName; + private final String ownerName; public Item(int id, String name, String ownerName) { this.id = id; diff --git a/spring-security-modules/spring-security-core/src/test/java/com/baeldung/denyonmissing/DenyOnMissingControllerIntegrationTest.java b/spring-security-modules/spring-security-core/src/test/java/com/baeldung/denyonmissing/DenyOnMissingControllerIntegrationTest.java index 2f67168229..a6a9653013 100644 --- a/spring-security-modules/spring-security-core/src/test/java/com/baeldung/denyonmissing/DenyOnMissingControllerIntegrationTest.java +++ b/spring-security-modules/spring-security-core/src/test/java/com/baeldung/denyonmissing/DenyOnMissingControllerIntegrationTest.java @@ -41,10 +41,8 @@ public class DenyOnMissingControllerIntegrationTest { @Test @WithMockUser(username = "user") - public void givenANormalUser_whenCallingBye_thenAccessDenied() throws Exception { - ServletException exception = Assertions.assertThrows(ServletException.class, () -> { - mockMvc.perform(get("/bye")); - }); + public void givenANormalUser_whenCallingBye_thenAccessDenied() { + ServletException exception = Assertions.assertThrows(ServletException.class, () -> mockMvc.perform(get("/bye"))); Assertions.assertNotNull(exception); Assertions.assertEquals(exception.getCause().getClass(), AccessDeniedException.class); diff --git a/spring-security-modules/spring-security-core/src/test/java/com/baeldung/filterresponse/SpringSecurityJsonViewIntegrationTest.java b/spring-security-modules/spring-security-core/src/test/java/com/baeldung/filterresponse/SpringSecurityJsonViewIntegrationTest.java index fd80ae48c9..de4afa4132 100644 --- a/spring-security-modules/spring-security-core/src/test/java/com/baeldung/filterresponse/SpringSecurityJsonViewIntegrationTest.java +++ b/spring-security-modules/spring-security-core/src/test/java/com/baeldung/filterresponse/SpringSecurityJsonViewIntegrationTest.java @@ -15,7 +15,7 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -66,6 +66,6 @@ public class SpringSecurityJsonViewIntegrationTest { }); Assertions.assertEquals(exception.getCause().getClass(), IllegalArgumentException.class); - assertTrue(exception.getCause().getMessage().equals("Ambiguous @JsonView declaration for roles ROLE_ADMIN,ROLE_USER")); + assertEquals("Ambiguous @JsonView declaration for roles ROLE_ADMIN,ROLE_USER", exception.getCause().getMessage()); } } diff --git a/spring-security-modules/spring-security-core/src/test/java/com/baeldung/methodsecurity/MethodSecurityIntegrationTest.java b/spring-security-modules/spring-security-core/src/test/java/com/baeldung/methodsecurity/MethodSecurityIntegrationTest.java index 0ad01d9954..6f9fac5bb4 100644 --- a/spring-security-modules/spring-security-core/src/test/java/com/baeldung/methodsecurity/MethodSecurityIntegrationTest.java +++ b/spring-security-modules/spring-security-core/src/test/java/com/baeldung/methodsecurity/MethodSecurityIntegrationTest.java @@ -1,6 +1,7 @@ package com.baeldung.methodsecurity; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.util.ArrayList; @@ -50,7 +51,7 @@ public class MethodSecurityIntegrationTest { @WithMockUser(username = "john", roles = { "EDITOR" }) public void givenUsernameJohn_whenCallIsValidUsername_thenReturnTrue() { boolean isValid = userRoleService.isValidUsername("john"); - assertEquals(true, isValid); + assertTrue(isValid); } @Test(expected = AccessDeniedException.class) @@ -60,7 +61,7 @@ public class MethodSecurityIntegrationTest { } @Test(expected = AccessDeniedException.class) - @WithMockUser(username = "john", roles = { "USER" }) + @WithMockUser(username = "john") public void givenRoleUser_whenCallGetUsername2_thenReturnAccessDenied() { userRoleService.getUsername2(); } @@ -76,7 +77,7 @@ public class MethodSecurityIntegrationTest { @WithMockUser(username = "john", roles = { "VIEWER" }) public void givenUsernameJerry_whenCallIsValidUsername2_thenReturnFalse() { boolean isValid = userRoleService.isValidUsername2("jerry"); - assertEquals(false, isValid); + assertFalse(isValid); } @Test