diff --git a/aws-modules/aws-reactive/pom.xml b/aws-modules/aws-reactive/pom.xml
index 965ce8fdcf..e36a2d1a46 100644
--- a/aws-modules/aws-reactive/pom.xml
+++ b/aws-modules/aws-reactive/pom.xml
@@ -94,7 +94,6 @@
2.2.1.RELEASE
2.17.283
- 1.18.20
3.6.0
diff --git a/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/iteratorvsforloop/IteratorForLoopUnitTest.java b/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/iteratorvsforloop/IteratorForLoopUnitTest.java
new file mode 100644
index 0000000000..a7655c68eb
--- /dev/null
+++ b/core-java-modules/core-java-collections-5/src/test/java/com/baeldung/iteratorvsforloop/IteratorForLoopUnitTest.java
@@ -0,0 +1,129 @@
+package com.baeldung.iteratorvsforloop;
+
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.ConcurrentModificationException;
+import java.util.List;
+import java.util.Iterator;
+import java.util.Collections;
+import java.util.ListIterator;
+
+public class IteratorForLoopUnitTest {
+
+ @Test
+ public void givenEmptyCollection_whenUsingForLoop_thenNoElementsAreIterated() {
+ List names = Collections.emptyList();
+ StringBuilder stringBuilder = new StringBuilder();
+
+ for (int i = 0; i < names.size(); i++) {
+ stringBuilder.append(names.get(i));
+ }
+
+ assertEquals("", stringBuilder.toString());
+ }
+
+ @Test
+ public void givenEmptyCollection_whenUsingIterator_thenNoElementsAreIterated() {
+ List names = Collections.emptyList();
+ StringBuilder stringBuilder = new StringBuilder();
+
+ Iterator iterator = names.iterator();
+ while (iterator.hasNext()) {
+ stringBuilder.append(iterator.next());
+ }
+
+ assertEquals("", stringBuilder.toString());
+ }
+
+
+ @Test
+ public void givenCollectionWithElements_whenUsingForLoop_thenAllElementsAreIterated() {
+ List names = Arrays.asList("Alice", "Bob", "Charlie");
+ StringBuilder stringBuilder = new StringBuilder();
+
+ for (int i = 0; i < names.size(); i++) {
+ stringBuilder.append(names.get(i));
+ }
+
+ assertEquals("AliceBobCharlie", stringBuilder.toString());
+ }
+
+ @Test
+ public void givenCollectionWithElements_whenUsingIterator_thenAllElementsAreIterated() {
+ List names = Arrays.asList("Alice", "Bob", "Charlie");
+ StringBuilder stringBuilder = new StringBuilder();
+
+ Iterator iterator = names.iterator();
+ while (iterator.hasNext()) {
+ stringBuilder.append(iterator.next());
+ }
+
+ assertEquals("AliceBobCharlie", stringBuilder.toString());
+ }
+
+ @Test
+ public void givenCollectionWithElements_whenUsingForLoop_thenAllElementsAreIteratedReverseOrder() {
+ List names = Arrays.asList("Alice", "Bob", "Charlie");
+ StringBuilder stringBuilder = new StringBuilder();
+
+ for (int i = names.size() - 1; i >= 0; i--) {
+ stringBuilder.append(names.get(i));
+ }
+
+ assertEquals("CharlieBobAlice", stringBuilder.toString());
+ }
+
+ @Test
+ public void givenCollectionWithElements_whenUsingListIterator_thenAllElementsAreIteratedInReverseOrder() {
+ List names = Arrays.asList("Alice", "Bob", "Charlie");
+ StringBuilder stringBuilder = new StringBuilder();
+
+ ListIterator listIterator = names.listIterator(names.size());
+ while (listIterator.hasPrevious()) {
+ stringBuilder.append(listIterator.previous());
+ }
+
+ assertEquals("CharlieBobAlice", stringBuilder.toString());
+ }
+
+ @Test
+ public void givenCollectionWithElements_whenRemovingElementDuringForLoopIteration_thenConcurrentModificationExceptionIsThrown() {
+ List names = new ArrayList<>(List.of("Alice", "Bob", "Charlie"));
+
+ assertThrows(ConcurrentModificationException.class, () -> {
+ for (String name : names) {
+ names.remove("Bob");
+ }
+ });
+ }
+
+ @Test
+ public void givenCollectionWithElements_whenRemovingElementUsingIterator_thenElementIsRemovedSafely() {
+ List names = new ArrayList<>(Arrays.asList("Alice", "Bob", "Charlie"));
+ Iterator iterator = names.iterator();
+
+ while (iterator.hasNext()) {
+ String name = iterator.next();
+ if (name.equals("Bob")) {
+ iterator.remove();
+ }
+ }
+ List expected = Arrays.asList("Alice", "Charlie");
+ assertIterableEquals(expected, names);
+ }
+
+ @Test
+ public void givenCollectionWithElements_whenModifyingElementToLowerCaseDuringForLoopIteration_thenElementsAreModifiedToLowerCase() {
+ List names = new ArrayList<>(List.of("Alice", "Bob", "Charlie"));
+
+ for (int i = 0; i < names.size(); i++) {
+ names.set(i, names.get(i).toLowerCase());
+ }
+
+ List expected = Arrays.asList("alice","bob", "charlie");
+ assertIterableEquals(expected, names);
+ }
+}
diff --git a/core-java-modules/core-java-collections-maps-3/README.md b/core-java-modules/core-java-collections-maps-3/README.md
index 0d07bde8c1..d7b0153a69 100644
--- a/core-java-modules/core-java-collections-maps-3/README.md
+++ b/core-java-modules/core-java-collections-maps-3/README.md
@@ -10,4 +10,5 @@ This module contains articles about Map data structures in Java.
- [Java HashMap Load Factor](https://www.baeldung.com/java-hashmap-load-factor)
- [Converting Java Properties to HashMap](https://www.baeldung.com/java-convert-properties-to-hashmap)
- [Get Values and Keys as ArrayList From a HashMap](https://www.baeldung.com/java-values-keys-arraylists-hashmap)
-- More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-2)
+- [Remove Duplicate Values From HashMap in Java](https://www.baeldung.com/java-hashmap-delete-duplicates)
+- More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-2)[[next -->]](/core-java-modules/core-java-collections-maps-4)
diff --git a/core-java-modules/core-java-collections-maps-6/src/test/java/com/baeldung/map/removeduplicate/RemoveDuplicateValuesUnitTest.java b/core-java-modules/core-java-collections-maps-3/src/test/java/com/baeldung/map/removeduplicate/RemoveDuplicateValuesUnitTest.java
similarity index 98%
rename from core-java-modules/core-java-collections-maps-6/src/test/java/com/baeldung/map/removeduplicate/RemoveDuplicateValuesUnitTest.java
rename to core-java-modules/core-java-collections-maps-3/src/test/java/com/baeldung/map/removeduplicate/RemoveDuplicateValuesUnitTest.java
index 080bc46289..e1fca2b93a 100644
--- a/core-java-modules/core-java-collections-maps-6/src/test/java/com/baeldung/map/removeduplicate/RemoveDuplicateValuesUnitTest.java
+++ b/core-java-modules/core-java-collections-maps-3/src/test/java/com/baeldung/map/removeduplicate/RemoveDuplicateValuesUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.map.removeuplicate;
+package com.baeldung.map.removeduplicate;
import static java.util.stream.Collectors.toMap;
import static org.assertj.core.api.Assertions.assertThat;
diff --git a/core-java-modules/core-java-collections-maps-4/README.md b/core-java-modules/core-java-collections-maps-4/README.md
index 9dd9cbe0d9..cc7c9b77e0 100644
--- a/core-java-modules/core-java-collections-maps-4/README.md
+++ b/core-java-modules/core-java-collections-maps-4/README.md
@@ -9,3 +9,4 @@ This module contains articles about Map data structures in Java.
- [Difference Between Map and HashMap in Java](https://www.baeldung.com/java-map-vs-hashmap)
- [How to Create a New Entry in a Map](https://www.baeldung.com/java-map-new-entry)
- [Difference Between Map and MultivaluedMap in Java](https://www.baeldung.com/java-map-vs-multivaluedmap)
+- More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-3)[[next -->]](/core-java-modules/core-java-collections-maps-5)
diff --git a/core-java-modules/core-java-collections-maps-5/README.md b/core-java-modules/core-java-collections-maps-5/README.md
index e1817c7ba4..b952bbeb2d 100644
--- a/core-java-modules/core-java-collections-maps-5/README.md
+++ b/core-java-modules/core-java-collections-maps-5/README.md
@@ -10,4 +10,5 @@
- [How to Invert a Map in Java](https://www.baeldung.com/java-invert-map)
- [Implementing a Map with Multiple Keys in Java](https://www.baeldung.com/java-multiple-keys-map)
- [Difference Between Map.ofEntries() and Map.of()](https://www.baeldung.com/map-ofentries-and-map-of)
-- More articles: [[<-- prev]](../core-java-collections-maps-4)
+- More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-4)[[next -->]](/core-java-modules/core-java-collections-maps-6)
+
diff --git a/core-java-modules/core-java-collections-maps-6/README.md b/core-java-modules/core-java-collections-maps-6/README.md
index f116d0315e..4e03cdee36 100644
--- a/core-java-modules/core-java-collections-maps-6/README.md
+++ b/core-java-modules/core-java-collections-maps-6/README.md
@@ -7,6 +7,7 @@
- [Converting JsonNode Object to Map](https://www.baeldung.com/jackson-jsonnode-map)
- [How to Modify a Key in a HashMap?](https://www.baeldung.com/java-hashmap-modify-key)
- [Converting String or String Array to Map in Java](https://www.baeldung.com/java-convert-string-to-map)
-- [Remove Duplicate Values From HashMap in Java](https://www.baeldung.com/java-hashmap-delete-duplicates)
- [Sorting Java Map in Descending Order](https://www.baeldung.com/java-sort-map-descending)
- [Convert HashMap.toString() to HashMap in Java](https://www.baeldung.com/hashmap-from-tostring)
+- More articles: [[<-- prev]](/core-java-modules/core-java-collections-maps-5)[[next -->]](/core-java-modules/core-java-collections-maps-7)
+
diff --git a/core-java-modules/core-java-streams-3/README.md b/core-java-modules/core-java-streams-3/README.md
index 70d9e68a5e..45da963eb3 100644
--- a/core-java-modules/core-java-streams-3/README.md
+++ b/core-java-modules/core-java-streams-3/README.md
@@ -11,4 +11,4 @@ This module contains articles about the Stream API in Java.
- [Should We Close a Java Stream?](https://www.baeldung.com/java-stream-close)
- [Returning Stream vs. Collection](https://www.baeldung.com/java-return-stream-collection)
- [Convert a Java Enumeration Into a Stream](https://www.baeldung.com/java-enumeration-to-stream)
-- More articles: [[<-- prev>]](/../core-java-streams-2)
+- More articles: [[<-- prev>]](/../core-java-streams-2) [[next -->]](/../core-java-streams-4)
diff --git a/core-java-modules/core-java-streams-4/README.md b/core-java-modules/core-java-streams-4/README.md
index c6717ec5fe..554649fdaa 100644
--- a/core-java-modules/core-java-streams-4/README.md
+++ b/core-java-modules/core-java-streams-4/README.md
@@ -10,3 +10,4 @@
- [Understanding the Difference Between Stream.of() and IntStream.range()](https://www.baeldung.com/java-stream-of-and-intstream-range)
- [Check if Object Is an Array in Java](https://www.baeldung.com/java-check-if-object-is-an-array)
- [Mapping an Array of Integers to Strings Using Java Streams](https://www.baeldung.com/java-stream-integer-array-to-strings)
+- More articles: [[<-- prev>]](/../core-java-streams-3) [[next -->]](/../core-java-streams-5)
diff --git a/core-java-modules/core-java-streams-5/README.md b/core-java-modules/core-java-streams-5/README.md
index 41fcb129df..6e160e68ad 100644
--- a/core-java-modules/core-java-streams-5/README.md
+++ b/core-java-modules/core-java-streams-5/README.md
@@ -6,7 +6,7 @@
- [Partition a Stream in Java](https://www.baeldung.com/java-partition-stream)
- [Taking Every N-th Element from Finite and Infinite Streams in Java](https://www.baeldung.com/java-nth-element-finite-infinite-streams)
- [Modifying Objects Within Stream While Iterating](https://www.baeldung.com/java-stream-modify-objects-during-iteration)
-- [Convert a Stream into a Map or Multimap in Java](https://www.baeldung.com/java-convert-stream-map-multimap)
- [How to Avoid NoSuchElementException in Stream API](https://www.baeldung.com/java-streams-api-avoid-nosuchelementexception)
- [Get Index of First Element Matching Boolean Using Java Streams](https://www.baeldung.com/java-streams-find-first-match-index)
- [Handling NullPointerException in findFirst() When the First Element Is Null](https://www.baeldung.com/java-handle-nullpointerexception-findfirst-first-null)
+- More articles: [[<-- prev>]](/../core-java-streams-4)
diff --git a/core-java-modules/core-java-streams-maps/README.md b/core-java-modules/core-java-streams-maps/README.md
index f9f7dffad9..8f311d91a5 100644
--- a/core-java-modules/core-java-streams-maps/README.md
+++ b/core-java-modules/core-java-streams-maps/README.md
@@ -1,2 +1,3 @@
## Relevant Articles:
- [Handle Duplicate Keys When Producing Map Using Java Stream](https://www.baeldung.com/java-duplicate-keys-when-producing-map-using-stream)
+- [Convert a Stream into a Map or Multimap in Java](https://www.baeldung.com/java-convert-stream-map-multimap)
\ No newline at end of file
diff --git a/core-java-modules/core-java-streams-maps/src/test/java/com/baeldung/streams/streamtomapandmultimap/StreamToMapAndMultiMapUnitTest.java b/core-java-modules/core-java-streams-maps/src/test/java/com/baeldung/streams/streamtomapandmultimap/StreamToMapAndMultiMapUnitTest.java
new file mode 100644
index 0000000000..6e8c26a76e
--- /dev/null
+++ b/core-java-modules/core-java-streams-maps/src/test/java/com/baeldung/streams/streamtomapandmultimap/StreamToMapAndMultiMapUnitTest.java
@@ -0,0 +1,107 @@
+package com.baeldung.streams.streamtomapandmultimap;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.junit.Test;
+
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.ListMultimap;
+
+public class StreamToMapAndMultiMapUnitTest {
+ @Test
+ public void givenStringStream_whenConvertingToMapWithMerge_thenExpectedMapIsGenerated() {
+ Stream stringStream = Stream.of("one", "two", "three", "two");
+
+ Map mergedMap = stringStream.collect(
+ Collectors.toMap(s -> s, s -> s, (s1, s2) -> s1 + ", " + s2)
+ );
+
+ // Define the expected map
+ Map expectedMap = Map.of(
+ "one", "one",
+ "two", "two, two",
+ "three", "three"
+ );
+
+ assertEquals(expectedMap, mergedMap);
+ }
+
+ @Test
+ public void givenStringStream_whenConvertingToMultimap_thenExpectedMultimapIsGenerated() {
+ Stream stringStream = Stream.of("one", "two", "three", "two");
+
+ ListMultimap multimap = stringStream.collect(
+ ArrayListMultimap::create,
+ (map, element) -> map.put(element, element),
+ ArrayListMultimap::putAll
+ );
+
+ ListMultimap expectedMultimap = ArrayListMultimap.create();
+ expectedMultimap.put("one", "one");
+ expectedMultimap.put("two", "two");
+ expectedMultimap.put("two", "two");
+ expectedMultimap.put("three", "three");
+
+ assertEquals(expectedMultimap, multimap);
+ }
+
+ @Test
+ public void givenStringStream_whenConvertingToMultimapWithStreamReduce_thenExpectedMultimapIsGenerated() {
+ Stream stringStream = Stream.of("one", "two", "three", "two");
+
+ Map> multimap = stringStream.reduce(
+ new HashMap<>(),
+ (map, element) -> {
+ map.computeIfAbsent(element, k -> new ArrayList<>()).add(element);
+ return map;
+ },
+ (map1, map2) -> {
+ map2.forEach((key, value) -> map1.merge(key, value, (list1, list2) -> {
+ list1.addAll(list2);
+ return list1;
+ }));
+ return map1;
+ }
+ );
+
+ Map> expectedMultimap = new HashMap<>();
+ expectedMultimap.put("one", Collections.singletonList("one"));
+ expectedMultimap.put("two", Arrays.asList("two", "two"));
+ expectedMultimap.put("three", Collections.singletonList("three"));
+
+ assertEquals(expectedMultimap, multimap);
+ }
+
+ @Test
+ public void givenStringStream_whenConvertingToMapWithStreamReduce_thenExpectedMapIsGenerated() {
+ Stream stringStream = Stream.of("one", "two", "three", "two");
+
+ Map resultMap = stringStream.reduce(
+ new HashMap<>(),
+ (map, element) -> {
+ map.put(element, element);
+ return map;
+ },
+ (map1, map2) -> {
+ map1.putAll(map2);
+ return map1;
+ }
+ );
+
+ Map expectedMap = new HashMap<>();
+ expectedMap.put("one", "one");
+ expectedMap.put("two", "two");
+ expectedMap.put("three", "three");
+
+ assertEquals(expectedMap, resultMap);
+ }
+}
diff --git a/jsf/pom.xml b/jsf/pom.xml
index 09dea98f65..ec014540a0 100644
--- a/jsf/pom.xml
+++ b/jsf/pom.xml
@@ -14,7 +14,6 @@
-
javax.annotation
javax.annotation-api
diff --git a/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java b/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToObjectNodeUnitTest.java
similarity index 86%
rename from json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java
rename to json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToObjectNodeUnitTest.java
index 38d097e5b8..15927b6008 100644
--- a/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToJsonObjectUnitTest.java
+++ b/json-modules/json-conversion/src/test/java/com/baeldung/jsonnodetojsonobject/JsonNodeToObjectNodeUnitTest.java
@@ -9,7 +9,7 @@ import org.junit.Test;
import static org.junit.Assert.*;
-public class JsonNodeToJsonObjectUnitTest {
+public class JsonNodeToObjectNodeUnitTest {
public static String jsonString = "{\"name\": \"John\", \"gender\": \"male\", \"company\": \"Baeldung\", \"isEmployee\": true, \"age\": 30}";
@@ -18,7 +18,7 @@ public class JsonNodeToJsonObjectUnitTest {
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(jsonString);
- ObjectNode objectNode = objectMapper.createObjectNode().setAll((ObjectNode) jsonNode);
+ ObjectNode objectNode = (ObjectNode) jsonNode;
assertEquals("John", objectNode.get("name").asText());
assertEquals("male", objectNode.get("gender").asText());
diff --git a/kubernetes-modules/jkube-demo/pom.xml b/kubernetes-modules/jkube-demo/pom.xml
index 6fedc0f24a..fe75a0cc14 100644
--- a/kubernetes-modules/jkube-demo/pom.xml
+++ b/kubernetes-modules/jkube-demo/pom.xml
@@ -3,17 +3,19 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ com.baeldung
+ jkube-demo
+ 0.0.1-SNAPSHOT
+ jkube-demo
+ jkube-demo
+
com.baeldung
parent-boot-2
0.0.1-SNAPSHOT
../../parent-boot-2
- com.baeldung
- jkube-demo
- 0.0.1-SNAPSHOT
- jkube-demo
- jkube-demo
+
org.springframework.boot
diff --git a/microservices-modules/rest-express/pom.xml b/microservices-modules/rest-express/pom.xml
index 1b22bb8117..be1c142a94 100644
--- a/microservices-modules/rest-express/pom.xml
+++ b/microservices-modules/rest-express/pom.xml
@@ -2,14 +2,13 @@
-
- microservices-modules
- com.baeldung
- 1.0.0-SNAPSHOT
-
4.0.0
-
+ rest-express
+ 1.0.0-SNAPSHOT
rest-express
+ jar
+ A Basic, MongoDB-backed Service Suite
+ https://github.com/RestExpress/RestExpress-Scaffold
- A Basic, MongoDB-backed Service Suite
- https://github.com/RestExpress/RestExpress-Scaffold
- 1.0.0-SNAPSHOT
- rest-express
- jar
+
+
+ microservices-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+
diff --git a/parent-spring-6/pom.xml b/parent-spring-6/pom.xml
index 7aaffb5483..7418c019c4 100644
--- a/parent-spring-6/pom.xml
+++ b/parent-spring-6/pom.xml
@@ -35,7 +35,7 @@
- 6.0.12
+ 6.1.2
diff --git a/persistence-modules/core-java-persistence-3/pom.xml b/persistence-modules/core-java-persistence-3/pom.xml
index 26ac2a5218..60562859a7 100644
--- a/persistence-modules/core-java-persistence-3/pom.xml
+++ b/persistence-modules/core-java-persistence-3/pom.xml
@@ -1,15 +1,19 @@
-
+
4.0.0
com.baeldung.core-java-persistence-3
core-java-persistence-3
- core-java-persistence-3
0.1.0-SNAPSHOT
+ core-java-persistence-3
jar
+
com.baeldung
persistence-modules
1.0.0-SNAPSHOT
+
com.h2database
@@ -22,6 +26,7 @@
${commons-dbutils.version}
+
2.1.214
1.8.1
diff --git a/persistence-modules/flyway-repair/pom.xml b/persistence-modules/flyway-repair/pom.xml
index 2cae31c8a6..f7fa4f4d5e 100644
--- a/persistence-modules/flyway-repair/pom.xml
+++ b/persistence-modules/flyway-repair/pom.xml
@@ -10,9 +10,9 @@
com.baeldung
- parent-boot-2
+ parent-boot-3
0.0.1-SNAPSHOT
- ../../parent-boot-2
+ ../../parent-boot-3
@@ -74,7 +74,10 @@
src/main/resources/application-${spring-boot.run.profiles}.properties
- 10.2.0
+ 10.4.0
+ 17
+ 17
+ 17
\ No newline at end of file
diff --git a/persistence-modules/flyway-repair/src/test/java/FlywayAppIntegrationTest.java b/persistence-modules/flyway-repair/src/test/java/FlywayAppIntegrationTest.java
new file mode 100644
index 0000000000..e2280ac2e4
--- /dev/null
+++ b/persistence-modules/flyway-repair/src/test/java/FlywayAppIntegrationTest.java
@@ -0,0 +1,38 @@
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Set;
+
+import javax.sql.DataSource;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import com.baeldung.flywaycallbacks.FlywayApplication;
+
+@RunWith(SpringRunner.class)
+@ContextConfiguration(classes = { FlywayApplication.class })
+public class FlywayAppIntegrationTest {
+
+ @Autowired
+ private DataSource dataSource;
+
+ @Test
+ public void testAllMigrationsExecuted() throws SQLException {
+ DatabaseMetaData metadata = dataSource.getConnection()
+ .getMetaData();
+ ResultSet resultSet = metadata.getTables(null, null, null, new String[] { "TABLE" });
+ Set tables = Set.of("TABLE_ONE", "TABLE_TWO", "TABLE_THREE", "TABLE_FOUR");
+ int migrations = 0;
+ while (resultSet.next()) {
+ if (tables.contains(resultSet.getString("TABLE_NAME"))) {
+ migrations++;
+ }
+ }
+ Assert.assertEquals(migrations, 4);
+ }
+}
diff --git a/persistence-modules/jooq/pom.xml b/persistence-modules/jooq/pom.xml
index c6de8e3d40..d0f1b733a4 100644
--- a/persistence-modules/jooq/pom.xml
+++ b/persistence-modules/jooq/pom.xml
@@ -31,20 +31,34 @@
jooq-codegen
${jooq.version}
+
+
+
+ commons-io
+ commons-io
+ 2.15.1
+ test
+
+
org.postgresql
postgresql
${postgresql.version}
+ runtime
com.h2database
h2
${h2.version}
+ runtime
- 3.18.7
+ 17
+ 17
+ 17
+ 3.19.0
\ No newline at end of file
diff --git a/persistence-modules/jooq/src/test/java/com/baeldung/jooq/CodeGenerationIntegrationTest.java b/persistence-modules/jooq/src/test/java/com/baeldung/jooq/CodeGenerationIntegrationTest.java
new file mode 100644
index 0000000000..3ca0919eaa
--- /dev/null
+++ b/persistence-modules/jooq/src/test/java/com/baeldung/jooq/CodeGenerationIntegrationTest.java
@@ -0,0 +1,75 @@
+package com.baeldung.jooq;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.nio.file.Files;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+
+import org.jooq.DSLContext;
+import org.jooq.SQLDialect;
+import org.jooq.codegen.GenerationTool;
+import org.jooq.impl.DSL;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.baeldung.jooq.model.tables.Article;
+import com.baeldung.jooq.model.tables.Author;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.commons.io.FileUtils;
+
+public class CodeGenerationIntegrationTest {
+
+ static DSLContext context;
+
+ @BeforeClass
+ public static void setup() throws SQLException {
+ Connection conn = DriverManager.getConnection("jdbc:h2:mem:tes;INIT=CREATE SCHEMA IF NOT EXISTS \"public\"");
+ context = DSL.using(conn, SQLDialect.H2);
+
+ context.createTable(Author.AUTHOR)
+ .columns(
+ Author.AUTHOR.ID,
+ Author.AUTHOR.FIRST_NAME,
+ Author.AUTHOR.LAST_NAME,
+ Author.AUTHOR.AGE
+ )
+ .execute();
+ context.createTable(Article.ARTICLE)
+ .columns(
+ Article.ARTICLE.ID,
+ Article.ARTICLE.TITLE,
+ Article.ARTICLE.DESCRIPTION,
+ Article.ARTICLE.AUTHOR_ID
+ )
+ .execute();
+ }
+
+ @AfterClass
+ public static void cleanup() throws IOException {
+ File generatedDirectory = new File("src/main/java/com/baeldung/jooq/generated");
+ FileUtils.deleteDirectory(generatedDirectory);
+ }
+
+ @Test
+ public void testClassGenerationFromExistingDatabase() throws Exception {
+
+ File generatedDirectory = new File("src/main/java/com/baeldung/jooq/generated");
+
+ assertFalse(generatedDirectory.exists());
+
+ URL jooqConfigURL = getClass().getClassLoader().getResource("jooq-config.xml");
+ assertNotNull(jooqConfigURL);
+ File file = new File(jooqConfigURL.getFile());
+ GenerationTool.generate(Files.readString(file.toPath()));
+
+ assertTrue(generatedDirectory.exists());
+ }
+}
diff --git a/persistence-modules/jooq/src/test/java/com/baeldung/jooq/CrudLiveTest.java b/persistence-modules/jooq/src/test/java/com/baeldung/jooq/CrudIntegrationTest.java
similarity index 99%
rename from persistence-modules/jooq/src/test/java/com/baeldung/jooq/CrudLiveTest.java
rename to persistence-modules/jooq/src/test/java/com/baeldung/jooq/CrudIntegrationTest.java
index d41344c08e..0d8df27ccc 100644
--- a/persistence-modules/jooq/src/test/java/com/baeldung/jooq/CrudLiveTest.java
+++ b/persistence-modules/jooq/src/test/java/com/baeldung/jooq/CrudIntegrationTest.java
@@ -28,7 +28,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
-public class CrudLiveTest {
+public class CrudIntegrationTest {
static DSLContext context;
diff --git a/persistence-modules/jooq/src/test/resources/jooq-config.xml b/persistence-modules/jooq/src/test/resources/jooq-config.xml
new file mode 100644
index 0000000000..2eed2fbe80
--- /dev/null
+++ b/persistence-modules/jooq/src/test/resources/jooq-config.xml
@@ -0,0 +1,26 @@
+
+
+
+
+ org.h2.Driver
+ jdbc:h2:mem:tes
+
+
+
+
+
+ org.jooq.codegen.JavaGenerator
+
+
+ org.jooq.meta.h2.H2Database
+ public
+ .*
+
+
+
+
+ com.baeldung.jooq.generated
+ src/main/java
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml
index 5ebc5b2cd4..6caedb3273 100644
--- a/persistence-modules/pom.xml
+++ b/persistence-modules/pom.xml
@@ -108,7 +108,7 @@
spring-jpa
spring-jpa-2
spring-jdbc
- spring-jdbc-2
+ spring-jdbc-2
spring-mybatis
spring-persistence-simple
diff --git a/persistence-modules/spring-data-jdbc/pom.xml b/persistence-modules/spring-data-jdbc/pom.xml
index 630fe141b3..9128c70b98 100644
--- a/persistence-modules/spring-data-jdbc/pom.xml
+++ b/persistence-modules/spring-data-jdbc/pom.xml
@@ -7,9 +7,9 @@
com.baeldung
- parent-boot-2
+ parent-boot-3
0.0.1-SNAPSHOT
- ../../parent-boot-2
+ ../../parent-boot-3
@@ -36,4 +36,8 @@
+
+ true
+
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springdatajdbcintro/repository/PersonRepository.java b/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springdatajdbcintro/repository/PersonRepository.java
index ceb7a968a4..b2f026fa0c 100644
--- a/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springdatajdbcintro/repository/PersonRepository.java
+++ b/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springdatajdbcintro/repository/PersonRepository.java
@@ -3,7 +3,6 @@ package com.baeldung.springdatajdbcintro.repository;
import com.baeldung.springdatajdbcintro.entity.Person;
import org.springframework.data.jdbc.repository.query.Modifying;
import org.springframework.data.jdbc.repository.query.Query;
-import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
diff --git a/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springmultipledatasources/todos/Todo.java b/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springmultipledatasources/todos/Todo.java
index 56f513027b..1dbe75d91f 100644
--- a/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springmultipledatasources/todos/Todo.java
+++ b/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springmultipledatasources/todos/Todo.java
@@ -1,9 +1,9 @@
package com.baeldung.springmultipledatasources.todos;
-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 Todo {
diff --git a/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springmultipledatasources/topics/Topic.java b/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springmultipledatasources/topics/Topic.java
index 390300ff1a..49b33d9b96 100644
--- a/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springmultipledatasources/topics/Topic.java
+++ b/persistence-modules/spring-data-jdbc/src/main/java/com/baeldung/springmultipledatasources/topics/Topic.java
@@ -1,9 +1,9 @@
package com.baeldung.springmultipledatasources.topics;
-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 Topic {
diff --git a/persistence-modules/spring-data-jpa-query-2/pom.xml b/persistence-modules/spring-data-jpa-query-2/pom.xml
index 62bf7f0314..6ef1adad14 100644
--- a/persistence-modules/spring-data-jpa-query-2/pom.xml
+++ b/persistence-modules/spring-data-jpa-query-2/pom.xml
@@ -1,7 +1,7 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
spring-data-jpa-query-2
spring-data-jpa-query-2
diff --git a/persistence-modules/spring-data-jpa-repo-3/pom.xml b/persistence-modules/spring-data-jpa-repo-3/pom.xml
index 211e8a2d96..5c57606d31 100644
--- a/persistence-modules/spring-data-jpa-repo-3/pom.xml
+++ b/persistence-modules/spring-data-jpa-repo-3/pom.xml
@@ -3,16 +3,17 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ spring-data-jpa-repo-3
+ 0.0.1-SNAPSHOT
+ spring-data-jpa-repo-3
+ spring-data-jpa-repo-3
+
com.baeldung
parent-boot-3
0.0.1-SNAPSHOT
../../parent-boot-3
- spring-data-jpa-repo-3
- 0.0.1-SNAPSHOT
- spring-data-jpa-repo-3
- spring-data-jpa-repo-3
diff --git a/persistence-modules/spring-data-yugabytedb/pom.xml b/persistence-modules/spring-data-yugabytedb/pom.xml
index d7f7576cfe..ec10275da4 100644
--- a/persistence-modules/spring-data-yugabytedb/pom.xml
+++ b/persistence-modules/spring-data-yugabytedb/pom.xml
@@ -10,11 +10,15 @@
com.baeldung
- parent-boot-2
+ parent-boot-3
0.0.1-SNAPSHOT
- ../../parent-boot-2
+ ../../parent-boot-3
+
+ com.baeldung.Main
+
+
org.springframework.boot
diff --git a/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/User.java b/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/User.java
index 54bbf2617c..c6c40c6953 100644
--- a/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/User.java
+++ b/persistence-modules/spring-data-yugabytedb/src/main/java/com/baeldung/User.java
@@ -1,11 +1,11 @@
package com.baeldung;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-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.Table;
@Entity
@Table(name = "users")
diff --git a/persistence-modules/spring-data-yugabytedb/src/main/resources/application.properties b/persistence-modules/spring-data-yugabytedb/src/main/resources/application.properties
index fdb3d50ec8..19c539ec9d 100644
--- a/persistence-modules/spring-data-yugabytedb/src/main/resources/application.properties
+++ b/persistence-modules/spring-data-yugabytedb/src/main/resources/application.properties
@@ -2,3 +2,5 @@ spring.datasource.url=jdbc:postgresql://localhost:5433/yugabyte
spring.datasource.username=yugabyte
spring.datasource.password=yugabyte
spring.jpa.hibernate.ddl-auto=create
+spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
+
diff --git a/persistence-modules/spring-jdbc-2/pom.xml b/persistence-modules/spring-jdbc-2/pom.xml
index ce79c1c615..7942e7675d 100644
--- a/persistence-modules/spring-jdbc-2/pom.xml
+++ b/persistence-modules/spring-jdbc-2/pom.xml
@@ -1,9 +1,8 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
org.example
spring-jdbc-2
1.0-SNAPSHOT
diff --git a/persistence-modules/spring-mybatis/pom.xml b/persistence-modules/spring-mybatis/pom.xml
index 1b2223653b..6de7cef347 100644
--- a/persistence-modules/spring-mybatis/pom.xml
+++ b/persistence-modules/spring-mybatis/pom.xml
@@ -9,9 +9,9 @@
com.baeldung
- parent-boot-2
+ parent-boot-3
0.0.1-SNAPSHOT
- ../../parent-boot-2
+ ../../parent-boot-3
@@ -78,11 +78,12 @@
- 5.3.15
+ 6.0.13
- 2.0.6
+ 3.0.3
3.5.2
- 2.2.0
+ 3.0.3
+ true
\ No newline at end of file
diff --git a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonUnitTest.java b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonUnitTest.java
index 2a93ca3d61..ab1cdce2aa 100644
--- a/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonUnitTest.java
+++ b/persistence-modules/spring-mybatis/src/test/java/com/baeldung/mybatis/spring/ArticleMapperCommonUnitTest.java
@@ -5,7 +5,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import static org.assertj.core.api.Assertions.assertThat;
-class ArticleMapperCommonUnitTest {
+abstract class ArticleMapperCommonUnitTest {
@Autowired
ArticleMapper articleMapper;
diff --git a/quarkus-modules/quarkus-funqy/pom.xml b/quarkus-modules/quarkus-funqy/pom.xml
index f5ba9d08d8..dbccc5e987 100644
--- a/quarkus-modules/quarkus-funqy/pom.xml
+++ b/quarkus-modules/quarkus-funqy/pom.xml
@@ -13,6 +13,7 @@
quarkus-modules
1.0.0-SNAPSHOT
+
@@ -24,6 +25,7 @@
+
io.quarkus
@@ -48,6 +50,7 @@
test
+
@@ -86,6 +89,7 @@
+
native
@@ -134,4 +138,5 @@
2.16.0.Final
3.0.0-M7
+
diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/pom.xml b/spring-security-modules/spring-security-web-rest-basic-auth/pom.xml
index 9a3b21af92..1b63860b92 100644
--- a/spring-security-modules/spring-security-web-rest-basic-auth/pom.xml
+++ b/spring-security-modules/spring-security-web-rest-basic-auth/pom.xml
@@ -10,8 +10,9 @@
com.baeldung
- spring-security-modules
+ parent-boot-3
0.0.1-SNAPSHOT
+ ../../parent-boot-3
@@ -92,8 +93,8 @@
- org.apache.httpcomponents
- httpclient
+ org.apache.httpcomponents.client5
+ httpclient5
commons-logging
@@ -101,19 +102,6 @@
-
-
- javax.servlet
- javax.servlet-api
- ${javax.servlet-api.version}
- provided
-
-
- javax.servlet
- jstl
- ${jstl.version}
- runtime
-
com.google.guava
@@ -127,9 +115,9 @@
test
- javax.xml.bind
- jaxb-api
- ${jaxb-api.version}
+ jakarta.xml.bind
+ jakarta.xml.bind-api
+ 4.0.1
@@ -230,6 +218,7 @@
4.5.8
1.6.1
+ com.baeldung.inmemory.InMemoryAuthApplication
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java
index 07344819c0..01d0c83bb5 100644
--- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java
+++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/basic/MyBasicAuthenticationEntryPoint.java
@@ -4,9 +4,8 @@ import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint;
import org.springframework.stereotype.Component;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java
index 81f82a2c1c..c903fe12bb 100644
--- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java
+++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/client/HttpComponentsClientHttpRequestFactoryBasicAuth.java
@@ -2,13 +2,13 @@ package com.baeldung.client;
import java.net.URI;
-import org.apache.http.HttpHost;
-import org.apache.http.client.AuthCache;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.impl.auth.BasicScheme;
-import org.apache.http.impl.client.BasicAuthCache;
-import org.apache.http.protocol.BasicHttpContext;
-import org.apache.http.protocol.HttpContext;
+import org.apache.hc.client5.http.auth.AuthCache;
+import org.apache.hc.client5.http.impl.auth.BasicAuthCache;
+import org.apache.hc.client5.http.impl.auth.BasicScheme;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.core5.http.HttpHost;
+import org.apache.hc.core5.http.protocol.BasicHttpContext;
+import org.apache.hc.core5.http.protocol.HttpContext;
import org.springframework.http.HttpMethod;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/client/RestTemplateFactory.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/client/RestTemplateFactory.java
index aac4f8cebd..425708abc8 100644
--- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/client/RestTemplateFactory.java
+++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/client/RestTemplateFactory.java
@@ -1,6 +1,6 @@
package com.baeldung.client;
-import org.apache.http.HttpHost;
+import org.apache.hc.core5.http.HttpHost;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.http.client.ClientHttpRequestFactory;
@@ -35,7 +35,7 @@ public class RestTemplateFactory implements FactoryBean, Initializ
@Override
public void afterPropertiesSet() {
- HttpHost host = new HttpHost("localhost", 8082, "http");
+ HttpHost host = new HttpHost( "http", "localhost", 8082);
final ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactoryBasicAuth(host);
restTemplate = new RestTemplate(requestFactory);
restTemplate.getInterceptors().add(new BasicAuthenticationInterceptor("user1", "user1Pass"));
diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/CustomFilter.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/CustomFilter.java
index 6bb12610fa..a9509ddafa 100644
--- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/CustomFilter.java
+++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/CustomFilter.java
@@ -2,10 +2,10 @@ package com.baeldung.filter;
import org.springframework.web.filter.GenericFilterBean;
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
import java.io.IOException;
public class CustomFilter extends GenericFilterBean {
diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java
index 5714b2fb3e..ce50448605 100644
--- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java
+++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/filter/CustomWebSecurityConfigurerAdapter.java
@@ -30,14 +30,10 @@ public class CustomWebSecurityConfigurerAdapter {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
- http.authorizeRequests()
- .antMatchers("/securityNone")
- .permitAll()
- .anyRequest()
- .authenticated()
- .and()
- .httpBasic()
- .authenticationEntryPoint(authenticationEntryPoint);
+ http.authorizeHttpRequests(expressionInterceptUrlRegistry ->
+ expressionInterceptUrlRegistry.requestMatchers("/securityNone").permitAll()
+ .anyRequest().authenticated())
+ .httpBasic(httpSecurityHttpBasicConfigurer -> httpSecurityHttpBasicConfigurer.authenticationEntryPoint(authenticationEntryPoint));
http.addFilterAfter(new CustomFilter(), BasicAuthenticationFilter.class);
return http.build();
}
diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/inmemory/InMemoryAuthWebSecurityConfigurer.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/inmemory/InMemoryAuthWebSecurityConfigurer.java
index 839fa15734..5af2a68ac3 100644
--- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/inmemory/InMemoryAuthWebSecurityConfigurer.java
+++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/inmemory/InMemoryAuthWebSecurityConfigurer.java
@@ -2,6 +2,7 @@ package com.baeldung.inmemory;
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.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
@@ -25,13 +26,11 @@ public class InMemoryAuthWebSecurityConfigurer {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
- http.authorizeRequests()
- .antMatchers("/private/**")
- .authenticated()
- .antMatchers("/public/**")
- .permitAll()
- .and()
- .httpBasic();
+ http.authorizeHttpRequests(authorizationManagerRequestMatcherRegistry ->
+ authorizationManagerRequestMatcherRegistry.requestMatchers("/private/**").authenticated()
+ .requestMatchers("/public/**").permitAll()
+ )
+ .httpBasic(Customizer.withDefaults());
return http.build();
}
diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/inmemory/InMemoryNoOpAuthWebSecurityConfigurer.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/inmemory/InMemoryNoOpAuthWebSecurityConfigurer.java
index 72d3ef79d7..ba86d14aa5 100644
--- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/inmemory/InMemoryNoOpAuthWebSecurityConfigurer.java
+++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/inmemory/InMemoryNoOpAuthWebSecurityConfigurer.java
@@ -1,6 +1,7 @@
package com.baeldung.inmemory;
import org.springframework.context.annotation.Bean;
+import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
@@ -21,13 +22,9 @@ public class InMemoryNoOpAuthWebSecurityConfigurer {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
- http.authorizeRequests()
- .antMatchers("/private/**")
- .authenticated()
- .antMatchers("/public/**")
- .permitAll()
- .and()
- .httpBasic();
+ http.authorizeHttpRequests(authorizationManagerRequestMatcherRegistry -> authorizationManagerRequestMatcherRegistry.requestMatchers("/private/**").authenticated()
+ .requestMatchers("/public/**").permitAll())
+ .httpBasic(Customizer.withDefaults());
return http.build();
}
}
diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/passwordstorage/PasswordStorageWebSecurityConfigurer.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/passwordstorage/PasswordStorageWebSecurityConfigurer.java
index a1c6e1ee76..5892762ac9 100644
--- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/passwordstorage/PasswordStorageWebSecurityConfigurer.java
+++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/passwordstorage/PasswordStorageWebSecurityConfigurer.java
@@ -46,7 +46,7 @@ public class PasswordStorageWebSecurityConfigurer {
PasswordEncoder defaultEncoder = new StandardPasswordEncoder();
Map encoders = new HashMap<>();
encoders.put("bcrypt", new BCryptPasswordEncoder());
- encoders.put("scrypt", new SCryptPasswordEncoder());
+ encoders.put("scrypt", new SCryptPasswordEncoder(1, 1, 1, 1, 10));
encoders.put("noop", NoOpPasswordEncoder.getInstance());
DelegatingPasswordEncoder passwordEncoder = new DelegatingPasswordEncoder("bcrypt", encoders);
diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java
index 7dc53e3e1e..d53aa5bdfe 100644
--- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java
+++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java
@@ -2,9 +2,9 @@ package com.baeldung.security;
import java.io.IOException;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java
index 1ae89adb89..cf7e9ee212 100644
--- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java
+++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/security/RestAuthenticationEntryPoint.java
@@ -2,8 +2,8 @@ package com.baeldung.security;
import java.io.IOException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
@@ -16,8 +16,7 @@ import org.springframework.stereotype.Component;
public final class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {
@Override
- public void commence(final HttpServletRequest request, final HttpServletResponse response, final AuthenticationException authException) throws IOException {
+ public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
}
-
}
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/web/controller/BarController.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/web/controller/BarController.java
index 6f7dc91e7e..0fd0bdac4f 100644
--- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/web/controller/BarController.java
+++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/web/controller/BarController.java
@@ -2,8 +2,9 @@ package com.baeldung.web.controller;
import java.nio.charset.Charset;
-import org.apache.commons.codec.binary.Base64;
import com.baeldung.web.dto.Bar;
+
+import org.apache.hc.client5.http.utils.Base64;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.http.HttpHeaders;
@@ -35,7 +36,7 @@ public class BarController {
public HttpHeaders createHeaders(String username, String password){
return new HttpHeaders() {{
String auth = username + ":" + password;
- byte[] encodedAuth = Base64.encodeBase64(
+ byte[] encodedAuth = Base64.encodeBase64(
auth.getBytes(Charset.forName("US-ASCII")) );
String authHeader = "Basic " + new String( encodedAuth );
set( "Authorization", authHeader );
diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/web/dto/Bar.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/web/dto/Bar.java
index eb139b0ec1..1bb7476669 100644
--- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/web/dto/Bar.java
+++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/web/dto/Bar.java
@@ -2,7 +2,7 @@ package com.baeldung.web.dto;
import java.io.Serializable;
-import javax.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Bar implements Serializable {
diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/web/dto/Foo.java b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/web/dto/Foo.java
index 23cfab132d..f904be0ad9 100644
--- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/web/dto/Foo.java
+++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/java/com/baeldung/web/dto/Foo.java
@@ -2,7 +2,7 @@ package com.baeldung.web.dto;
import java.io.Serializable;
-import javax.xml.bind.annotation.XmlRootElement;
+import jakarta.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Foo implements Serializable {
diff --git a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/resources/webSecurityConfig.xml b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/resources/webSecurityConfig.xml
index 2ff9a1de15..d3d47579de 100644
--- a/spring-security-modules/spring-security-web-rest-basic-auth/src/main/resources/webSecurityConfig.xml
+++ b/spring-security-modules/spring-security-web-rest-basic-auth/src/main/resources/webSecurityConfig.xml
@@ -11,6 +11,7 @@
+
@@ -22,7 +23,7 @@
-
+
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-web-sockets/pom.xml b/spring-security-modules/spring-security-web-sockets/pom.xml
index 513ee28c85..5f11bc9580 100644
--- a/spring-security-modules/spring-security-web-sockets/pom.xml
+++ b/spring-security-modules/spring-security-web-sockets/pom.xml
@@ -11,9 +11,9 @@
com.baeldung
- parent-spring-5
+ parent-spring-6
0.0.1-SNAPSHOT
- ../../parent-spring-5
+ ../../parent-spring-6
@@ -73,6 +73,16 @@
hibernate-core
${hibernate-core.version}
+
+ org.hibernate
+ hibernate-validator
+ ${hibernate-validator.version}
+
+
+ org.glassfish.expressly
+ expressly
+ ${expressly.version}
+
com.h2database
h2
@@ -92,7 +102,7 @@
org.springframework.security
spring-security-messaging
- ${spring-security.version}
+ ${spring-security-messaging.version}
@@ -107,24 +117,9 @@
- javax.servlet
- javax.servlet-api
- ${javax.servlet-api.version}
-
-
- javax.servlet.jsp.jstl
- jstl-api
- ${jstl-api.version}
-
-
- javax.servlet.jsp
- javax.servlet.jsp-api
- ${javax.servlet.jsp-api.version}
-
-
- javax.servlet
- jstl
- ${jstl.version}
+ jakarta.platform
+ jakarta.jakartaee-api
+ ${jakartaee-api.version}
@@ -144,17 +139,11 @@
- org.springframework.boot
- spring-boot-starter-test
- ${spring-boot-starter-test.version}
+ org.springframework
+ spring-test
+ ${spring.version}
test
-
-
- javax.xml.bind
- jaxb-api
- ${jaxb-api.version}
-
@@ -194,11 +183,15 @@
- 5.2.10.Final
- 1.11.3.RELEASE
- 1.5.10.RELEASE
+ 6.1.5
+ 6.0.2
+ 6.1.7.Final
+ 8.0.1.Final
+ 5.0.0
+ 3.1.0
+ 3.1.0
+ 10.0.0
1.7.6
- 2.3.1
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/AppConfig.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/AppConfig.java
index afb1970b25..0329f91373 100644
--- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/AppConfig.java
+++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/AppConfig.java
@@ -9,7 +9,7 @@ import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.resource.PathResourceResolver;
import org.springframework.web.servlet.view.JstlView;
import org.springframework.web.servlet.view.UrlBasedViewResolver;
@@ -20,8 +20,9 @@ import java.sql.SQLException;
@EnableJpaRepositories
@ComponentScan("com.baeldung.springsecuredsockets")
@Import({ SecurityConfig.class, DataStoreConfig.class, SocketBrokerConfig.class, SocketSecurityConfig.class })
-public class AppConfig extends WebMvcConfigurerAdapter {
+public class AppConfig implements WebMvcConfigurer {
+ @Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/login").setViewName("login");
diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/DataStoreConfig.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/DataStoreConfig.java
index 2246c0055b..16ace5ed88 100644
--- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/DataStoreConfig.java
+++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/DataStoreConfig.java
@@ -13,7 +13,7 @@ import org.springframework.orm.jpa.vendor.Database;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.annotation.EnableTransactionManagement;
-import javax.persistence.EntityManagerFactory;
+import jakarta.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import java.util.Properties;
diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/SecurityConfig.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/SecurityConfig.java
index 64f5169d2d..24687e6f21 100644
--- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/SecurityConfig.java
+++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/SecurityConfig.java
@@ -6,11 +6,14 @@ import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
+import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
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.configuration.WebSecurityCustomizer;
+import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
+import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@@ -86,43 +89,30 @@ public class SecurityConfig {
*/
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
- http.authorizeRequests()
- .antMatchers("/", "/index", "/authenticate")
- .permitAll()
- .antMatchers("/secured/**/**", "/secured/**/**/**", "/secured/socket", "/secured/success")
- .authenticated()
- .anyRequest()
- .authenticated()
- .and()
- .formLogin()
- .loginPage("/login")
- .permitAll()
- .usernameParameter("username")
- .passwordParameter("password")
- .loginProcessingUrl("/authenticate")
- .successHandler(loginSuccessHandler())
- .failureUrl("/denied")
- .permitAll()
- .and()
- .logout()
- .logoutSuccessHandler(logoutSuccessHandler())
- .and()
+ http.authorizeHttpRequests(authorizationManagerRequestMatcherRegistry ->
+ authorizationManagerRequestMatcherRegistry
+ .requestMatchers("/", "/index", "/authenticate").permitAll()
+ .requestMatchers("/secured/**/**", "/secured/**/**/**", "/secured/socket", "/secured/success").authenticated()
+ .anyRequest().authenticated())
+ .formLogin(httpSecurityFormLoginConfigurer -> httpSecurityFormLoginConfigurer.loginPage("/login").permitAll()
+ .usernameParameter("username")
+ .passwordParameter("password")
+ .loginProcessingUrl("/authenticate")
+ .successHandler(loginSuccessHandler())
+ .failureUrl("/denied").permitAll())
+ .logout(httpSecurityLogoutConfigurer -> httpSecurityLogoutConfigurer.logoutSuccessHandler(logoutSuccessHandler()))
/**
* Applies to User Roles - not to login failures or unauthenticated access attempts.
*/
- .exceptionHandling()
- .accessDeniedHandler(accessDeniedHandler())
- .and()
+ .exceptionHandling(httpSecurityExceptionHandlingConfigurer -> httpSecurityExceptionHandlingConfigurer.accessDeniedHandler(accessDeniedHandler()))
.authenticationProvider(authenticationProvider());
/** Disabled for local testing */
- http.csrf()
- .disable();
+ http.csrf(AbstractHttpConfigurer::disable);
/** This is solely required to support H2 console viewing in Spring MVC with Spring Security */
- http.headers()
- .frameOptions()
- .disable();
+ http.headers(httpSecurityHeadersConfigurer -> httpSecurityHeadersConfigurer.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable))
+ .authorizeHttpRequests(Customizer.withDefaults());
return http.build();
}
@@ -135,8 +125,7 @@ public class SecurityConfig {
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
- return (web) -> web.ignoring()
- .antMatchers("/resources/**");
+ return (web) -> web.ignoring().requestMatchers("/resources/**");
}
}
diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/SocketBrokerConfig.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/SocketBrokerConfig.java
index 9b19de7b5a..4e641980e5 100644
--- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/SocketBrokerConfig.java
+++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/SocketBrokerConfig.java
@@ -8,14 +8,14 @@ import static com.baeldung.springsecuredsockets.Constants.SECURED_CHAT_SPECIFIC_
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
-import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
+import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
@Configuration
@EnableWebSocketMessageBroker
@ComponentScan("com.baeldung.springsecuredsockets.controllers")
-public class SocketBrokerConfig extends AbstractWebSocketMessageBrokerConfigurer {
+public class SocketBrokerConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/WebAppInitializer.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/WebAppInitializer.java
index 84c045a75a..244d5dd93b 100644
--- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/WebAppInitializer.java
+++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/config/WebAppInitializer.java
@@ -4,9 +4,9 @@ import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRegistration;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRegistration;
public class WebAppInitializer implements WebApplicationInitializer {
diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/controllers/CsrfTokenController.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/controllers/CsrfTokenController.java
index 3d10dad391..97fe6ff1ee 100644
--- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/controllers/CsrfTokenController.java
+++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/controllers/CsrfTokenController.java
@@ -5,7 +5,7 @@ import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
@Controller
public class CsrfTokenController {
diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/controllers/SocketController.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/controllers/SocketController.java
index 6a74009c16..570d603fad 100644
--- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/controllers/SocketController.java
+++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/controllers/SocketController.java
@@ -30,8 +30,7 @@ public class SocketController {
@MessageMapping(SECURED_CHAT)
@SendTo(SECURED_CHAT_HISTORY)
public OutputMessage sendAll(Message msg) throws Exception {
- OutputMessage out = new OutputMessage(msg.getFrom(), msg.getText(), new SimpleDateFormat("HH:mm").format(new Date()));
- return out;
+ return new OutputMessage(msg.getFrom(), msg.getText(), new SimpleDateFormat("HH:mm").format(new Date()));
}
/**
diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/domain/Role.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/domain/Role.java
index 09fee9a31b..1f3ba3b283 100644
--- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/domain/Role.java
+++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/domain/Role.java
@@ -1,6 +1,6 @@
package com.baeldung.springsecuredsockets.domain;
-import javax.persistence.*;
+import jakarta.persistence.*;
import java.util.Set;
@Entity
diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/domain/User.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/domain/User.java
index 8f84b2246d..96daff8427 100644
--- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/domain/User.java
+++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/domain/User.java
@@ -1,12 +1,12 @@
package com.baeldung.springsecuredsockets.domain;
-import javax.persistence.*;
+import jakarta.persistence.*;
import java.util.Set;
//Custom User Model
@Entity
-@Table(name = "user")
+@Table(name = "users")
public class User {
@Id
diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomAccessDeniedHandler.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomAccessDeniedHandler.java
index 0ab31a9c86..54d3f60232 100644
--- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomAccessDeniedHandler.java
+++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomAccessDeniedHandler.java
@@ -4,9 +4,9 @@ import org.springframework.http.HttpStatus;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomLoginSuccessHandler.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomLoginSuccessHandler.java
index 281fd0f163..c78aa20690 100644
--- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomLoginSuccessHandler.java
+++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomLoginSuccessHandler.java
@@ -7,8 +7,8 @@ import org.springframework.http.HttpStatus;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CustomLoginSuccessHandler implements AuthenticationSuccessHandler {
diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomLogoutSuccessHandler.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomLogoutSuccessHandler.java
index 620e75fb39..3f8e43f590 100644
--- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomLogoutSuccessHandler.java
+++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomLogoutSuccessHandler.java
@@ -5,15 +5,14 @@ import org.springframework.http.HttpStatus;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CustomLogoutSuccessHandler implements LogoutSuccessHandler {
@Override
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
- throws IOException, ServletException {
+ throws IOException {
response.setStatus(HttpStatus.OK.value());
response.sendRedirect(request.getContextPath() + "/index");
diff --git a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomUserDetailsService.java b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomUserDetailsService.java
index a0eb4d4bde..52f8fe315b 100644
--- a/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomUserDetailsService.java
+++ b/spring-security-modules/spring-security-web-sockets/src/main/java/com/baeldung/springsecuredsockets/security/CustomUserDetailsService.java
@@ -17,7 +17,7 @@ import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.HashSet;
-@Service()
+@Service
public class CustomUserDetailsService implements UserDetailsService {
Logger log = LoggerFactory.getLogger(CustomUserDetailsService.class);
diff --git a/spring-soap/pom.xml b/spring-soap/pom.xml
index c796b08e9a..d1dff51a3e 100644
--- a/spring-soap/pom.xml
+++ b/spring-soap/pom.xml
@@ -9,9 +9,9 @@
com.baeldung
- parent-boot-2
+ parent-boot-3
0.0.1-SNAPSHOT
- ../parent-boot-2
+ ../parent-boot-3
@@ -42,10 +42,6 @@
jaxb-runtime
-
- javax.xml.bind
- jaxb-api
-
@@ -77,9 +73,9 @@
- org.jvnet.jaxb2.maven2
- maven-jaxb2-plugin
- ${maven-jaxb2-plugin.version}
+ org.jvnet.jaxb
+ jaxb-maven-plugin
+ ${jaxb-maven-plugin.version}
@@ -103,7 +99,7 @@
4.0.0
+ 4.0.0
3.1.0
- 0.15.3
\ No newline at end of file
diff --git a/spring-soap/src/main/java/com/baeldung/springsoap/CountryRepository.java b/spring-soap/src/main/java/com/baeldung/springsoap/CountryRepository.java
index 183027cdb6..3688854f98 100644
--- a/spring-soap/src/main/java/com/baeldung/springsoap/CountryRepository.java
+++ b/spring-soap/src/main/java/com/baeldung/springsoap/CountryRepository.java
@@ -3,7 +3,7 @@ package com.baeldung.springsoap;
import java.util.HashMap;
import java.util.Map;
-import javax.annotation.PostConstruct;
+import jakarta.annotation.PostConstruct;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
diff --git a/spring-web-modules/spring-mvc-basics-4/pom.xml b/spring-web-modules/spring-mvc-basics-4/pom.xml
index 455e4e488c..7e8ef257c7 100644
--- a/spring-web-modules/spring-mvc-basics-4/pom.xml
+++ b/spring-web-modules/spring-mvc-basics-4/pom.xml
@@ -9,9 +9,9 @@
com.baeldung
- parent-boot-2
+ parent-boot-3
0.0.1-SNAPSHOT
- ../../parent-boot-2
+ ../../parent-boot-3
@@ -31,6 +31,7 @@
javax.servlet
jstl
+ 1.2
org.springframework.boot
diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/config/WebConfig.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/config/WebConfig.java
index e9b59a2b23..7ccbbd6410 100644
--- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/config/WebConfig.java
+++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/config/WebConfig.java
@@ -1,22 +1,12 @@
package com.baeldung.config;
+import com.baeldung.contexts.Greeting;
+import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
-import org.springframework.web.servlet.view.InternalResourceViewResolver;
-import org.springframework.web.servlet.view.JstlView;
-import org.thymeleaf.spring5.SpringTemplateEngine;
-import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
-import org.thymeleaf.spring5.view.ThymeleafViewResolver;
-import org.thymeleaf.templatemode.TemplateMode;
-import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
-import org.thymeleaf.templateresolver.ITemplateResolver;
-
-import com.baeldung.contexts.Greeting;
-import com.fasterxml.jackson.databind.ObjectMapper;
/**
* Web Configuration for the entire app
diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/services/GreeterService.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/services/GreeterService.java
index f68b2fe5af..dfff103d7e 100644
--- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/services/GreeterService.java
+++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/contexts/services/GreeterService.java
@@ -1,7 +1,7 @@
package com.baeldung.contexts.services;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import com.baeldung.contexts.Greeting;
diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/constraint/MaxSizeConstraint.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/constraint/MaxSizeConstraint.java
index b5adab5d86..d96607e1e9 100644
--- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/constraint/MaxSizeConstraint.java
+++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/constraint/MaxSizeConstraint.java
@@ -1,11 +1,11 @@
package com.baeldung.validation.listvalidation.constraint;
+import jakarta.validation.Constraint;
+import jakarta.validation.Payload;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
-import javax.validation.Constraint;
-import javax.validation.Payload;
-
@Constraint(validatedBy = MaxSizeConstraintValidator.class)
@Retention(RetentionPolicy.RUNTIME)
public @interface MaxSizeConstraint {
diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/constraint/MaxSizeConstraintValidator.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/constraint/MaxSizeConstraintValidator.java
index 409b6e1ab5..edf140c6b1 100644
--- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/constraint/MaxSizeConstraintValidator.java
+++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/constraint/MaxSizeConstraintValidator.java
@@ -2,10 +2,9 @@ package com.baeldung.validation.listvalidation.constraint;
import java.util.List;
-import javax.validation.ConstraintValidator;
-import javax.validation.ConstraintValidatorContext;
-
import com.baeldung.validation.listvalidation.model.Movie;
+import jakarta.validation.ConstraintValidator;
+import jakarta.validation.ConstraintValidatorContext;
public class MaxSizeConstraintValidator implements ConstraintValidator> {
diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/controller/MovieController.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/controller/MovieController.java
index 45639cf303..f29818a393 100644
--- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/controller/MovieController.java
+++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/controller/MovieController.java
@@ -1,10 +1,10 @@
package com.baeldung.validation.listvalidation.controller;
-import java.util.List;
-
-import javax.validation.Valid;
-import javax.validation.constraints.NotEmpty;
-
+import com.baeldung.validation.listvalidation.constraint.MaxSizeConstraint;
+import com.baeldung.validation.listvalidation.model.Movie;
+import com.baeldung.validation.listvalidation.service.MovieService;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotEmpty;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
@@ -12,9 +12,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import com.baeldung.validation.listvalidation.constraint.MaxSizeConstraint;
-import com.baeldung.validation.listvalidation.model.Movie;
-import com.baeldung.validation.listvalidation.service.MovieService;
+import java.util.List;
@Validated
@RestController
diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/exception/ConstraintViolationExceptionHandler.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/exception/ConstraintViolationExceptionHandler.java
index 742be27f61..38a9b558a9 100644
--- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/exception/ConstraintViolationExceptionHandler.java
+++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/exception/ConstraintViolationExceptionHandler.java
@@ -1,10 +1,7 @@
package com.baeldung.validation.listvalidation.exception;
-import java.util.Set;
-
-import javax.validation.ConstraintViolation;
-import javax.validation.ConstraintViolationException;
-
+import jakarta.validation.ConstraintViolation;
+import jakarta.validation.ConstraintViolationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
@@ -12,6 +9,8 @@ import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
+import java.util.Set;
+
@RestControllerAdvice
public class ConstraintViolationExceptionHandler {
diff --git a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/model/Movie.java b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/model/Movie.java
index f5a49877bf..5302ea4a5a 100644
--- a/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/model/Movie.java
+++ b/spring-web-modules/spring-mvc-basics-4/src/main/java/com/baeldung/validation/listvalidation/model/Movie.java
@@ -1,8 +1,9 @@
package com.baeldung.validation.listvalidation.model;
+import jakarta.validation.constraints.NotEmpty;
+
import java.util.UUID;
-import javax.validation.constraints.NotEmpty;
public class Movie {
diff --git a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerAnnotationIntegrationTest.java b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerAnnotationIntegrationTest.java
index 7fd8f0c97f..cb70f80afe 100644
--- a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerAnnotationIntegrationTest.java
+++ b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerAnnotationIntegrationTest.java
@@ -40,7 +40,7 @@ public class ControllerAnnotationIntegrationTest {
@Test
public void testTestController() throws Exception {
- ModelAndView mv = this.mockMvc.perform(MockMvcRequestBuilders.get("/test/")).andReturn().getModelAndView();
+ ModelAndView mv = this.mockMvc.perform(MockMvcRequestBuilders.get("/test")).andReturn().getModelAndView();
// validate modal data
Assert.assertSame(mv.getModelMap().get("data").toString(), "Welcome home man");
diff --git a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerIntegrationTest.java b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerIntegrationTest.java
index a7e6bd6c4b..3431d74997 100644
--- a/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerIntegrationTest.java
+++ b/spring-web-modules/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerIntegrationTest.java
@@ -40,7 +40,7 @@ public class ControllerIntegrationTest {
@Test
public void testTestController() throws Exception {
- ModelAndView mv = this.mockMvc.perform(MockMvcRequestBuilders.get("/test/")).andReturn().getModelAndView();
+ ModelAndView mv = this.mockMvc.perform(MockMvcRequestBuilders.get("/test")).andReturn().getModelAndView();
// validate modal data
Assert.assertSame(mv.getModelMap().get("data").toString(), "Welcome home man");
diff --git a/testing-modules/gatling-java/pom.xml b/testing-modules/gatling-java/pom.xml
index 54dee1fd88..d28876b42c 100644
--- a/testing-modules/gatling-java/pom.xml
+++ b/testing-modules/gatling-java/pom.xml
@@ -33,7 +33,7 @@
org.projectlombok
lombok
- 1.18.24
+ ${lombok.version}
provided
diff --git a/web-modules/javax-servlets-2/pom.xml b/web-modules/javax-servlets-2/pom.xml
index 9ba12352fd..a6bfc6b473 100644
--- a/web-modules/javax-servlets-2/pom.xml
+++ b/web-modules/javax-servlets-2/pom.xml
@@ -68,6 +68,17 @@
+
+ org.mockito
+ mockito-core
+ ${mockito.version}
+ test
+
+
+ com.github.ua-parser
+ uap-java
+ ${uap.version}
+
@@ -101,6 +112,8 @@
2.22.2
10.0.4
1.10.0
+ 5.6.0
+ 1.5.4
\ No newline at end of file
diff --git a/web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/AccountServlet.java b/web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/AccountServlet.java
new file mode 100644
index 0000000000..3533bf500b
--- /dev/null
+++ b/web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/AccountServlet.java
@@ -0,0 +1,26 @@
+package com.baeldung.servlets;
+
+import java.io.IOException;
+import java.util.Map;
+
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.*;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.baeldung.servlets.clientinfo.AccountLogic;
+
+@WebServlet(name = "AccountServlet", urlPatterns = "/account")
+public class AccountServlet extends HttpServlet {
+ public static final Logger log = LoggerFactory.getLogger(AccountServlet.class);
+
+ @Override
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
+ AccountLogic accountLogic = new AccountLogic();
+ Map clientInfo = accountLogic.getClientInfo(request);
+ log.info("Request client info: {}, " + clientInfo);
+
+ response.setStatus(HttpServletResponse.SC_OK);
+ }
+}
diff --git a/web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/clientinfo/AccountLogic.java b/web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/clientinfo/AccountLogic.java
new file mode 100644
index 0000000000..00f3a5ca39
--- /dev/null
+++ b/web-modules/javax-servlets-2/src/main/java/com/baeldung/servlets/clientinfo/AccountLogic.java
@@ -0,0 +1,32 @@
+package com.baeldung.servlets.clientinfo;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import ua_parser.Client;
+import ua_parser.Parser;
+
+public class AccountLogic {
+ public Map getClientInfo(HttpServletRequest request) {
+ String remoteAddr = request.getRemoteAddr();
+ String remoteHost = request.getRemoteHost();
+ String remoteUser = request.getRemoteUser();
+ String contentType = request.getHeader("content-type");
+ String userAgent = request.getHeader("user-agent");
+
+ Parser uaParser = new Parser();
+ Client client = uaParser.parse(userAgent);
+
+ Map clientInfo = new HashMap<>();
+ clientInfo.put("os_family", client.os.family);
+ clientInfo.put("device_family", client.device.family);
+ clientInfo.put("userAgent_family", client.userAgent.family);
+ clientInfo.put("remote_address", remoteAddr);
+ clientInfo.put("remote_host", remoteHost);
+ clientInfo.put("remote_user", remoteUser);
+ clientInfo.put("content_type", contentType);
+ return clientInfo;
+ }
+}
diff --git a/web-modules/javax-servlets-2/src/test/java/com/baeldung/servlets/clientinfo/ClientInformationUnitTest.java b/web-modules/javax-servlets-2/src/test/java/com/baeldung/servlets/clientinfo/ClientInformationUnitTest.java
new file mode 100644
index 0000000000..4ff5256f37
--- /dev/null
+++ b/web-modules/javax-servlets-2/src/test/java/com/baeldung/servlets/clientinfo/ClientInformationUnitTest.java
@@ -0,0 +1,35 @@
+package com.baeldung.servlets.clientinfo;
+
+import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
+import static org.mockito.Mockito.when;
+
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+
+public class ClientInformationUnitTest {
+
+ @Test
+ void givenMockHttpServletRequestWithHeaders_whenGetClientInfo_thenReturnsUserAGentInfo() {
+ HttpServletRequest request = Mockito.mock(HttpServletRequest.class);
+
+ when(request.getHeader("user-agent")).thenReturn("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36, acceptLanguage:en-US,en;q=0.9");
+ when(request.getHeader("content-type")).thenReturn("application/json");
+ when(request.getRemoteAddr()).thenReturn("198.167.0.1");
+ when(request.getRemoteHost()).thenReturn("baeldung.com");
+ when(request.getRemoteUser()).thenReturn("baeldung");
+
+ AccountLogic accountLogic = new AccountLogic();
+ Map clientInfo = accountLogic.getClientInfo(request);
+ assertThat(clientInfo.get("os_family")).isEqualTo("Mac OS X");
+ assertThat(clientInfo.get("device_family")).isEqualTo("Mac");
+ assertThat(clientInfo.get("userAgent_family")).isEqualTo("Chrome");
+ assertThat(clientInfo.get("content_type")).isEqualTo("application/json");
+ assertThat(clientInfo.get("remote_user")).isEqualTo("baeldung");
+ assertThat(clientInfo.get("remote_address")).isEqualTo("198.167.0.1");
+ assertThat(clientInfo.get("remote_host")).isEqualTo("baeldung.com");
+ }
+}
\ No newline at end of file
diff --git a/xml-2/README.md b/xml-2/README.md
index a6762f2840..1075f34e1f 100644
--- a/xml-2/README.md
+++ b/xml-2/README.md
@@ -10,3 +10,5 @@ This module contains articles about eXtensible Markup Language (XML)
- [Convert an XML Object to a String in Java](https://www.baeldung.com/java-convert-xml-object-string)
- [Convert String Containing XML to org.w3c.dom.Document](https://www.baeldung.com/java-convert-string-xml-dom)
- [How to Parse XML to HashMap in Java](https://www.baeldung.com/java-xml-read-into-hashmap)
+- [Convert an XML File to CSV File](https://www.baeldung.com/java-convert-xml-csv)
+- - More articles: [[prev -->]](../xml)
\ No newline at end of file
diff --git a/xml/src/main/java/com/baeldung/xml/xml2csv/Xml2CsvExample.java b/xml-2/src/main/java/com/baeldung/xml/xml2csv/Xml2CsvExample.java
similarity index 100%
rename from xml/src/main/java/com/baeldung/xml/xml2csv/Xml2CsvExample.java
rename to xml-2/src/main/java/com/baeldung/xml/xml2csv/Xml2CsvExample.java
diff --git a/xml/src/main/resources/xml2csv/data.xml b/xml-2/src/main/resources/xml2csv/data.xml
similarity index 100%
rename from xml/src/main/resources/xml2csv/data.xml
rename to xml-2/src/main/resources/xml2csv/data.xml
diff --git a/xml/src/main/resources/xml2csv/style.xsl b/xml-2/src/main/resources/xml2csv/style.xsl
similarity index 100%
rename from xml/src/main/resources/xml2csv/style.xsl
rename to xml-2/src/main/resources/xml2csv/style.xsl
diff --git a/xml/src/test/java/com/baeldung/xml/xml2csv/Xml2CsvExampleUnitTest.java b/xml-2/src/test/java/com/baeldung/xml/xml2csv/Xml2CsvExampleUnitTest.java
similarity index 100%
rename from xml/src/test/java/com/baeldung/xml/xml2csv/Xml2CsvExampleUnitTest.java
rename to xml-2/src/test/java/com/baeldung/xml/xml2csv/Xml2CsvExampleUnitTest.java
diff --git a/xml/README.md b/xml/README.md
index 596ddc14aa..be12640252 100644
--- a/xml/README.md
+++ b/xml/README.md
@@ -13,4 +13,4 @@ This module contains articles about eXtensible Markup Language (XML)
- [Parsing an XML File Using StAX](https://www.baeldung.com/java-stax)
- [Parsing an XML File Using SAX Parser](https://www.baeldung.com/java-sax-parser)
- [Remove HTML Tags Using Java](https://www.baeldung.com/java-remove-html-tags)
-- [Convert an XML File to CSV File](https://www.baeldung.com/java-convert-xml-csv)
+- More articles: [[next -->]](../xml-2)