diff --git a/apache-libraries/src/test/java/com/baeldung/apache/beam/intro/WordCountUnitTest.java b/apache-libraries/src/test/java/com/baeldung/apache/beam/intro/WordCountIntegrationTest.java
similarity index 91%
rename from apache-libraries/src/test/java/com/baeldung/apache/beam/intro/WordCountUnitTest.java
rename to apache-libraries/src/test/java/com/baeldung/apache/beam/intro/WordCountIntegrationTest.java
index 77287066ac..5d51d8e5fa 100644
--- a/apache-libraries/src/test/java/com/baeldung/apache/beam/intro/WordCountUnitTest.java
+++ b/apache-libraries/src/test/java/com/baeldung/apache/beam/intro/WordCountIntegrationTest.java
@@ -7,7 +7,7 @@ import org.junit.Test;
import com.baeldung.apache.beam.intro.WordCount;
-public class WordCountUnitTest {
+public class WordCountIntegrationTest {
@Test
public void givenInputFile_whenWordCountRuns_thenJobFinishWithoutError() {
diff --git a/core-java-modules/core-java-annotations/pom.xml b/core-java-modules/core-java-annotations/pom.xml
index a1f84ab563..1acd347232 100644
--- a/core-java-modules/core-java-annotations/pom.xml
+++ b/core-java-modules/core-java-annotations/pom.xml
@@ -24,4 +24,12 @@
+
+
+ javax.annotation
+ javax.annotation-api
+ 1.3.2
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java b/core-java-modules/core-java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java
index 7b6bed807b..5907c159cb 100644
--- a/core-java-modules/core-java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java
+++ b/core-java-modules/core-java-collections-conversions-2/src/main/java/com/baeldung/modelmapper/UserList.java
@@ -9,6 +9,7 @@ import java.util.Collection;
*/
public class UserList {
+ public UserList() {}
private Collection users;
public Collection getUsers() {
diff --git a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java b/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java
index c2cc39c685..e634fddab8 100644
--- a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java
+++ b/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java
@@ -6,6 +6,7 @@ import com.baeldung.java_8_features.Person;
import org.junit.Test;
import java.util.Arrays;
+import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.NoSuchElementException;
@@ -71,4 +72,17 @@ public class Java8MaxMinUnitTest {
assertEquals(bugatti, maxBySpeed);
}
+
+ @Test
+ public void givenIntegerList_whenGetMinAndIndex_thenSuccess() {
+ final List listOfIntegers = Arrays.asList(11, 13, 9, 20, 7, 3, 30);
+ final Integer expectedMinValue = 3;
+ final Integer expectedMinIndex = 5;
+
+ Integer minValue = Collections.min(listOfIntegers);
+ Integer minIndex = listOfIntegers.indexOf(minValue);
+
+ assertEquals(minValue, expectedMinValue);
+ assertEquals(minIndex, expectedMinIndex);
+ }
}
diff --git a/core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerUnitTest.java b/core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerManualTest.java
similarity index 93%
rename from core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerUnitTest.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerManualTest.java
index 20e6a5ef5b..bd71cfc263 100644
--- a/core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerUnitTest.java
+++ b/core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerManualTest.java
@@ -2,7 +2,8 @@ package com.baeldung.concurrent.prioritytaskexecution;
import org.junit.Test;
-public class PriorityJobSchedulerUnitTest {
+//Converted to ManualTest due to thread sleep
+public class PriorityJobSchedulerManualTest {
private static final int POOL_SIZE = 1;
private static final int QUEUE_SIZE = 10;
diff --git a/core-java-modules/core-java-date-operations-3/README.md b/core-java-modules/core-java-date-operations-3/README.md
index 944ab4bd1b..0d36f9c8a2 100644
--- a/core-java-modules/core-java-date-operations-3/README.md
+++ b/core-java-modules/core-java-date-operations-3/README.md
@@ -5,4 +5,5 @@ This module contains articles about date operations in Java.
- [Create Date From Unix Timestamp in Java](https://www.baeldung.com/java-date-unix-timestamp)
- [Convert java.util.Date to java.sql.Date](https://www.baeldung.com/java-convert-util-date-to-sql)
+- [How to Determine Date of the First Day of the Week Using LocalDate in Java](https://www.baeldung.com/java-first-day-of-the-week)
- [[<-- Prev]](/core-java-modules/core-java-date-operations-2)
diff --git a/core-java-modules/core-java-io-4/src/test/resources/iostreams/TestFile.txt b/core-java-modules/core-java-io-4/src/test/resources/iostreams/TestFile.txt
new file mode 100644
index 0000000000..5dd01c177f
--- /dev/null
+++ b/core-java-modules/core-java-io-4/src/test/resources/iostreams/TestFile.txt
@@ -0,0 +1 @@
+Hello, world!
\ No newline at end of file
diff --git a/core-java-modules/core-java-jvm-2/pom.xml b/core-java-modules/core-java-jvm-2/pom.xml
index 01628b0908..59d2842ffe 100644
--- a/core-java-modules/core-java-jvm-2/pom.xml
+++ b/core-java-modules/core-java-jvm-2/pom.xml
@@ -27,9 +27,30 @@
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${maven.compiler.source}
+ ${maven.compiler.target}
+
+ --add-exports=java.base/jdk.internal.vm.annotation=ALL-UNNAMED
+
+
+
+
+
+
0.10
0.10.2
+
+ 11
+ 11
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-jvm-2/src/test/java/com/baeldung/memlayout/MemoryLayoutUnitTest.java b/core-java-modules/core-java-jvm-2/src/test/java/com/baeldung/memlayout/MemoryLayoutUnitTest.java
index 2f226d7657..760115877e 100644
--- a/core-java-modules/core-java-jvm-2/src/test/java/com/baeldung/memlayout/MemoryLayoutUnitTest.java
+++ b/core-java-modules/core-java-jvm-2/src/test/java/com/baeldung/memlayout/MemoryLayoutUnitTest.java
@@ -3,7 +3,8 @@ package com.baeldung.memlayout;
import org.junit.Test;
import org.openjdk.jol.info.ClassLayout;
import org.openjdk.jol.vm.VM;
-import sun.misc.Contended;
+
+import jdk.internal.vm.annotation.Contended;
public class MemoryLayoutUnitTest {
diff --git a/core-java-modules/core-java-jvm/pom.xml b/core-java-modules/core-java-jvm/pom.xml
index d26c72323f..856c6356a4 100644
--- a/core-java-modules/core-java-jvm/pom.xml
+++ b/core-java-modules/core-java-jvm/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
core-java-jvm
0.1.0-SNAPSHOT
@@ -30,13 +30,6 @@
esapi
${esapi.version}
-
- com.sun
- tools
- ${sun.tools.version}
- system
- ${java.home}/../lib/tools.jar
-
org.ow2.asm
asm
@@ -176,9 +169,8 @@
3.27.0-GA
- 1.8.0
0.10
- 8.0.1
+ 9.4
6.5.0
diff --git a/core-java-modules/core-java-jvm/src/main/java/com/baeldung/classloader/PrintClassLoader.java b/core-java-modules/core-java-jvm/src/main/java/com/baeldung/classloader/PrintClassLoader.java
index 09ee68bf6e..b976ac99f2 100644
--- a/core-java-modules/core-java-jvm/src/main/java/com/baeldung/classloader/PrintClassLoader.java
+++ b/core-java-modules/core-java-jvm/src/main/java/com/baeldung/classloader/PrintClassLoader.java
@@ -1,13 +1,5 @@
package com.baeldung.classloader;
-import com.sun.javafx.util.Logging;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLConnection;
import java.util.ArrayList;
public class PrintClassLoader {
@@ -15,7 +7,6 @@ public class PrintClassLoader {
public void printClassLoaders() throws ClassNotFoundException {
System.out.println("Classloader of this class:" + PrintClassLoader.class.getClassLoader());
- System.out.println("Classloader of Logging:" + Logging.class.getClassLoader());
System.out.println("Classloader of ArrayList:" + ArrayList.class.getClassLoader());
}
diff --git a/core-java-modules/core-java-jvm/src/test/java/com/baeldung/bytecode/ViewBytecodeUnitTest.java b/core-java-modules/core-java-jvm/src/test/java/com/baeldung/bytecode/ViewBytecodeUnitTest.java
index 5b0fdf26d4..2a7366c322 100644
--- a/core-java-modules/core-java-jvm/src/test/java/com/baeldung/bytecode/ViewBytecodeUnitTest.java
+++ b/core-java-modules/core-java-jvm/src/test/java/com/baeldung/bytecode/ViewBytecodeUnitTest.java
@@ -33,7 +33,7 @@ public class ViewBytecodeUnitTest {
JavaClass objectClazz = Repository.lookupClass("java.lang.Object");
assertEquals(objectClazz.getClassName(), "java.lang.Object");
- assertEquals(objectClazz.getMethods().length, 14);
+ assertEquals(objectClazz.getMethods().length, 12);
assertTrue(objectClazz.toString().contains("public class java.lang.Object"));
}
@@ -43,7 +43,7 @@ public class ViewBytecodeUnitTest {
ClassFile cf = cp.get("java.lang.Object").getClassFile();
assertEquals(cf.getName(), "java.lang.Object");
- assertEquals(cf.getMethods().size(), 14);
+ assertEquals(cf.getMethods().size(), 12);
}
}
diff --git a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/headlessmode/HeadlessModeUnitTest.java b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/headlessmode/HeadlessModeUnitTest.java
index a17c1600f3..d64d8c16da 100644
--- a/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/headlessmode/HeadlessModeUnitTest.java
+++ b/core-java-modules/core-java-lang-2/src/test/java/com/baeldung/headlessmode/HeadlessModeUnitTest.java
@@ -3,13 +3,12 @@ package com.baeldung.headlessmode;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
-import java.awt.Canvas;
-import java.awt.Font;
-import java.awt.FontMetrics;
-import java.awt.Frame;
-import java.awt.GraphicsEnvironment;
-import java.awt.HeadlessException;
+import java.awt.*;
import java.awt.image.BufferedImage;
+import java.awt.image.ColorModel;
+import java.awt.image.ComponentColorModel;
+import java.awt.image.DataBuffer;
+import java.awt.image.WritableRaster;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -58,7 +57,7 @@ public class HeadlessModeUnitTest {
boolean result = false;
try (InputStream inStream = HeadlessModeUnitTest.class.getResourceAsStream(IN_FILE); FileOutputStream outStream = new FileOutputStream(OUT_FILE)) {
BufferedImage inputImage = ImageIO.read(inStream);
- result = ImageIO.write(inputImage, FORMAT, outStream);
+ result = ImageIO.write(removeAlphaChannel(inputImage), FORMAT, outStream);
}
assertThat(result).isTrue();
@@ -84,4 +83,10 @@ public class HeadlessModeUnitTest {
assertThat(FlexibleApp.iAmFlexible()).isEqualTo(FlexibleApp.HEADED);
}
+ private BufferedImage removeAlphaChannel(BufferedImage inputImage) {
+ final WritableRaster raster = inputImage.getRaster();
+ final WritableRaster newRaster = raster.createWritableChild(0, 0, inputImage.getWidth(), inputImage.getHeight(), 0, 0, new int[]{0, 1, 2});
+ ColorModel newCM = new ComponentColorModel(inputImage.getColorModel().getColorSpace(), false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
+ return new BufferedImage(newCM, newRaster, false, null);
+ }
}
diff --git a/core-java-modules/core-java-nio/src/main/java/com/baeldung/lines/NumberOfLineFinder.java b/core-java-modules/core-java-nio/src/main/java/com/baeldung/lines/NumberOfLineFinder.java
index b355295dab..f5d5fb2b4f 100644
--- a/core-java-modules/core-java-nio/src/main/java/com/baeldung/lines/NumberOfLineFinder.java
+++ b/core-java-modules/core-java-nio/src/main/java/com/baeldung/lines/NumberOfLineFinder.java
@@ -37,7 +37,7 @@ public class NumberOfLineFinder {
int lines = 0;
try (LineNumberReader reader = new LineNumberReader(new FileReader(fileName))) {
reader.skip(Integer.MAX_VALUE);
- lines = reader.getLineNumber() + 1;
+ lines = reader.getLineNumber();
} catch (IOException ioe) {
ioe.printStackTrace();
}
diff --git a/core-java-modules/core-java-nio/src/test/java/com/baeldung/creationdate/CreationDateResolverUnitTest.java b/core-java-modules/core-java-nio/src/test/java/com/baeldung/creationdate/CreationDateResolverUnitTest.java
index 5402852c74..5e7929859d 100644
--- a/core-java-modules/core-java-nio/src/test/java/com/baeldung/creationdate/CreationDateResolverUnitTest.java
+++ b/core-java-modules/core-java-nio/src/test/java/com/baeldung/creationdate/CreationDateResolverUnitTest.java
@@ -21,9 +21,11 @@ public class CreationDateResolverUnitTest {
final Instant response = creationDateResolver.resolveCreationTimeWithBasicAttributes(path);
- assertTrue(Instant
- .now()
- .isAfter(response));
+ Optional.of(response).ifPresent((value) -> {
+ assertTrue(Instant
+ .now()
+ .isAfter(value));
+ });
}
diff --git a/core-java-modules/core-java-numbers-3/src/test/java/com/baeldung/formatNumber/FormatNumberUnitTest.java b/core-java-modules/core-java-numbers-3/src/test/java/com/baeldung/formatNumber/FormatNumberUnitTest.java
index 4f0358c6a2..6d78426a56 100644
--- a/core-java-modules/core-java-numbers-3/src/test/java/com/baeldung/formatNumber/FormatNumberUnitTest.java
+++ b/core-java-modules/core-java-numbers-3/src/test/java/com/baeldung/formatNumber/FormatNumberUnitTest.java
@@ -75,8 +75,8 @@ public class FormatNumberUnitTest {
public void givenCurrency_whenFormatNumberCurrencyWithChosenLocalisation_thenGetExpectedResult() {
double value = 23_500;
assertThat(currencyWithChosenLocalisation(value, new Locale("en", "US"))).isEqualTo("$23,500.00");
- assertThat(currencyWithChosenLocalisation(value, new Locale("zh", "CN"))).isEqualTo("¥23,500.00");
- assertThat(currencyWithChosenLocalisation(value, new Locale("pl", "PL"))).isEqualTo("23 500 zł");
+ assertThat(currencyWithChosenLocalisation(value, new Locale("zh", "CN"))).isEqualTo("¥23,500.00");
+ assertThat(currencyWithChosenLocalisation(value, new Locale("pl", "PL"))).isEqualTo("23 500,00 zł");
}
}
diff --git a/core-java-modules/core-java-security-algorithms/classpath b/core-java-modules/core-java-security-algorithms/classpath
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/core-java-modules/core-java-security/pom.xml b/core-java-modules/core-java-security/pom.xml
index b36de5ac4c..66b56ada74 100644
--- a/core-java-modules/core-java-security/pom.xml
+++ b/core-java-modules/core-java-security/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
core-java-security
0.1.0-SNAPSHOT
diff --git a/core-java-modules/core-java-streams-4/README.md b/core-java-modules/core-java-streams-4/README.md
index c6717ec5fe..4175fb1f70 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)
+- [Difference Between parallelStream() and stream().parallel() in Java](https://www.baeldung.com/java-parallelstream-vs-stream-parallel)
diff --git a/core-java-modules/core-java-string-conversions/pom.xml b/core-java-modules/core-java-string-conversions/pom.xml
index f10ae401b3..c715e22ed4 100644
--- a/core-java-modules/core-java-string-conversions/pom.xml
+++ b/core-java-modules/core-java-string-conversions/pom.xml
@@ -44,6 +44,7 @@
61.1
+ -Djava.locale.providers=COMPAT
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/datetostring/DateToStringFormatterUnitTest.java b/core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/datetostring/DateToStringFormatterUnitTest.java
index 221900fb0e..c4fb84713c 100644
--- a/core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/datetostring/DateToStringFormatterUnitTest.java
+++ b/core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/datetostring/DateToStringFormatterUnitTest.java
@@ -1,7 +1,6 @@
package com.baeldung.datetostring;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
@@ -14,7 +13,8 @@ import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
-import static org.junit.Assert.assertEquals;
+import org.junit.BeforeClass;
+import org.junit.Test;
public class DateToStringFormatterUnitTest {
diff --git a/core-java-modules/core-java-string-operations/pom.xml b/core-java-modules/core-java-string-operations/pom.xml
index 20e4df3ba3..0970125281 100644
--- a/core-java-modules/core-java-string-operations/pom.xml
+++ b/core-java-modules/core-java-string-operations/pom.xml
@@ -15,6 +15,11 @@
+
+ javax.xml.bind
+ jaxb-api
+ 2.4.0-b180725.0427
+
org.apache.commons
commons-lang3
diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml
index f2db98dbfb..d5011cddf7 100644
--- a/core-java-modules/pom.xml
+++ b/core-java-modules/pom.xml
@@ -16,9 +16,21 @@
- core-java
- core-java-8
- core-java-8-2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
core-java-annotations
core-java-arrays-sorting
core-java-arrays-guides
@@ -33,7 +45,6 @@
core-java-collections-4
core-java-collections-5
core-java-collections-conversions
- core-java-collections-conversions-2
core-java-collections-set-2
core-java-collections-list
core-java-collections-list-2
@@ -52,11 +63,9 @@
core-java-concurrency-collections
core-java-concurrency-collections-2
core-java-console
- core-java-8-datetime-2
core-java-datetime-string-2
core-java-date-operations-2
core-java-date-operations-3
- core-java-8-datetime
core-java-exceptions
core-java-exceptions-2
core-java-exceptions-3
@@ -77,14 +86,12 @@
core-java-jvm-2
core-java-jvm-3
core-java-lambdas
- core-java-lang
core-java-lang-2
core-java-lang-3
core-java-lang-4
core-java-lang-5
core-java-lang-math
core-java-lang-math-2
- core-java-lang-math-3
core-java-lang-oop-constructors
core-java-lang-oop-patterns
core-java-lang-oop-generics
@@ -102,27 +109,20 @@
core-java-networking-2
core-java-networking-4
core-java-nio
- core-java-nio-2
core-java-numbers
core-java-numbers-2
core-java-numbers-3
core-java-numbers-4
core-java-numbers-5
- core-java-numbers-conversions
core-java-optional
core-java-perf
core-java-reflection
core-java-reflection-2
- core-java-security
core-java-security-2
core-java-security-3
- core-java-serialization
core-java-security-algorithms
core-java-streams
- core-java-streams-2
core-java-streams-3
- core-java-streams-maps
- core-java-streams-collect
core-java-string-algorithms
core-java-string-algorithms-2
core-java-string-apis
@@ -131,7 +131,6 @@
core-java-string-conversions-2
core-java-string-operations
core-java-string-operations-2
- core-java-sun
core-java-regex
core-java-regex-2
core-java-uuid
diff --git a/core-java-modules/pre-jpms/pom.xml b/core-java-modules/pre-jpms/pom.xml
index cd4bd0faa3..11db8f8027 100644
--- a/core-java-modules/pre-jpms/pom.xml
+++ b/core-java-modules/pre-jpms/pom.xml
@@ -15,6 +15,11 @@
+
+ javax.xml.bind
+ jaxb-api
+ 2.4.0-b180725.0427
+
org.slf4j
slf4j-api
@@ -32,6 +37,9 @@
${source.version}
${target.version}
+
+ --add-exports=java.base/com.sun.crypto.provider=ALL-UNNAMED
+
@@ -72,8 +80,8 @@
3.1.1
3.8.0
- 1.8
- 1.8
+ 11
+ 11
\ No newline at end of file
diff --git a/core-java-modules/pre-jpms/src/main/java/com/baeldung/prejpms/App.java b/core-java-modules/pre-jpms/src/main/java/com/baeldung/prejpms/App.java
index 1afaae30e4..a69e0555c6 100644
--- a/core-java-modules/pre-jpms/src/main/java/com/baeldung/prejpms/App.java
+++ b/core-java-modules/pre-jpms/src/main/java/com/baeldung/prejpms/App.java
@@ -1,19 +1,18 @@
package com.baeldung.prejpms;
import java.io.StringWriter;
+import java.lang.StackWalker.Option;
+import java.lang.StackWalker.StackFrame;
+import com.sun.crypto.provider.SunJCE;
+import java.util.Base64;
+import java.util.concurrent.atomic.AtomicInteger;
import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.sun.crypto.provider.SunJCE;
-
-import sun.misc.BASE64Encoder;
-import sun.reflect.Reflection;
-
public class App {
private static final Logger LOGGER = LoggerFactory.getLogger(App.class);
@@ -37,14 +36,14 @@ public class App {
private static void getCallStackClassNames() {
try {
StringBuffer sbStack = new StringBuffer();
- int i = 0;
- Class> caller = Reflection.getCallerClass(i++);
- do {
- sbStack.append(i + ".")
- .append(caller.getName())
- .append("\n");
- caller = Reflection.getCallerClass(i++);
- } while (caller != null);
+ AtomicInteger i = new AtomicInteger(0);
+ StackWalker.getInstance((Option.RETAIN_CLASS_REFERENCE))
+ .walk(s -> s.map(StackFrame::getDeclaringClass)
+ .map(e -> {
+ i.getAndIncrement();
+ return e.getName();
+ }))
+ .forEach(name -> sbStack.append(String.format("%d. %s \n", i.get(), name)));
LOGGER.info("2. Call Stack:\n{}", sbStack);
} catch (Throwable e) {
LOGGER.error(e.toString());
@@ -54,7 +53,7 @@ public class App {
private static void getXmlFromObject(Book book) {
try {
Marshaller marshallerObj = JAXBContext.newInstance(Book.class)
- .createMarshaller();
+ .createMarshaller();
marshallerObj.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
StringWriter sw = new StringWriter();
@@ -68,7 +67,8 @@ public class App {
private static void getBase64EncodedString(String inputString) {
try {
- String encodedString = new BASE64Encoder().encode(inputString.getBytes());
+ String encodedString = new String(Base64.getEncoder()
+ .encode(inputString.getBytes()));
LOGGER.info("4. Base Encoded String: {}", encodedString);
} catch (Throwable e) {
LOGGER.error(e.toString());
diff --git a/dependeny-exclusion/core-java-exclusions/pom.xml b/dependeny-exclusion/core-java-exclusions/pom.xml
deleted file mode 100644
index cf1f6d1e1b..0000000000
--- a/dependeny-exclusion/core-java-exclusions/pom.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
- 4.0.0
- core-java-exclusions
- 0.0.0-SNAPSHOT
- core-java-exclusions
- jar
-
-
- com.baeldung.dependency-exclusion
- dependency-exclusion
- 0.0.1-SNAPSHOT
-
-
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- ${surefire-version}
-
- alphabetical
- 1
-
-
- junit
- false
-
-
-
-
-
-
- org.apache.maven.surefire
- surefire-junit47
- dummy
-
-
-
-
-
-
-
-
- junit
- junit
- test
-
-
-
-
diff --git a/dependeny-exclusion/core-java-exclusions/src/test/java/com/sample/project/tests/ExcludeDirectDependencyUnitTest.java b/dependeny-exclusion/core-java-exclusions/src/test/java/com/sample/project/tests/ExcludeDirectDependencyUnitTest.java
deleted file mode 100644
index ed2400f9ac..0000000000
--- a/dependeny-exclusion/core-java-exclusions/src/test/java/com/sample/project/tests/ExcludeDirectDependencyUnitTest.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.sample.project.tests;
-
-import static org.junit.Assert.assertTrue;
-
-import org.junit.Test;
-
-public class ExcludeDirectDependencyUnitTest {
- @Test
- public void basicUnitTest() {
- assertTrue(true);
- }
-}
diff --git a/dependeny-exclusion/dummy-surefire-junit47/pom.xml b/dependeny-exclusion/dummy-surefire-junit47/pom.xml
deleted file mode 100644
index 5859ddbe72..0000000000
--- a/dependeny-exclusion/dummy-surefire-junit47/pom.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
- 4.0.0
- org.apache.maven.surefire
- surefire-junit47
- dummy
-
diff --git a/dependeny-exclusion/pom.xml b/dependeny-exclusion/pom.xml
deleted file mode 100644
index ac83cc161a..0000000000
--- a/dependeny-exclusion/pom.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
- 4.0.0
- com.baeldung.dependency-exclusion
- dependency-exclusion
- dependency-exclusion
- pom
-
-
- com.baeldung
- parent-java
- 0.0.1-SNAPSHOT
- ../parent-java
-
-
-
- 2.22.2
-
-
-
- dummy-surefire-junit47
- core-java-exclusions
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- 3.7.0
-
- 1.8
- 1.8
-
- -parameters
-
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- ${surefire-version}
-
- 1
-
-
-
- org.apache.maven.surefire
- surefire-junit-platform
- ${surefire-version}
-
-
-
-
-
-
-
-
-
-
- junit
- junit
- 4.13
-
-
-
-
-
diff --git a/jackson-modules/jackson-core/README.md b/jackson-modules/jackson-core/README.md
index 0aa3dc5aef..d34a9e8bf7 100644
--- a/jackson-modules/jackson-core/README.md
+++ b/jackson-modules/jackson-core/README.md
@@ -14,3 +14,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Inheritance with Jackson](https://www.baeldung.com/jackson-inheritance)
- [Working with Tree Model Nodes in Jackson](https://www.baeldung.com/jackson-json-node-tree-model)
- [Get all the Keys in a JSON String Using JsonNode](https://www.baeldung.com/java-jsonnode-get-keys)
+- [Difference Between asText() and toString() in JsonNode](https://www.baeldung.com/java-jsonnode-astext-vs-tostring)
diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/offsetdatetime/Main.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/offsetdatetime/Main.java
new file mode 100644
index 0000000000..eb82c3c4c8
--- /dev/null
+++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/offsetdatetime/Main.java
@@ -0,0 +1,50 @@
+package com.baeldung.offsetdatetime;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+
+import java.time.OffsetDateTime;
+
+public class Main {
+ public static void main(String[] args) throws JsonProcessingException {
+ System.out.println(serializeUser());
+ System.out.println(customSerialize());
+ System.out.println(customDeserialize());
+ }
+
+ static String serializeUser() throws JsonProcessingException {
+ ObjectMapper objectMapper = new ObjectMapper();
+ objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+ objectMapper.registerModule(new JavaTimeModule());
+
+ User user = new User();
+ user.setCreatedAt(OffsetDateTime.parse("2021-09-30T15:30:00+01:00"));
+
+ return objectMapper.writeValueAsString(user);
+ }
+
+ static String customSerialize() throws JsonProcessingException {
+ ObjectMapper objectMapper = new ObjectMapper();
+
+ objectMapper.registerModule(new SimpleModule().addSerializer(OffsetDateTime.class, new OffsetDateTimeSerializer()));
+
+ User user = new User();
+ user.setCreatedAt(OffsetDateTime.parse("2021-09-30T15:30:00+01:00"));
+
+ return objectMapper.writeValueAsString(user);
+ }
+
+ static String customDeserialize() throws JsonProcessingException {
+ ObjectMapper objectMapper = new ObjectMapper();
+
+ objectMapper.registerModule(new SimpleModule().addDeserializer(OffsetDateTime.class, new OffsetDateTimeDeserializer()));
+
+ String jsonString = "{\"createdAt\":\"30-09-2021 15:30:00 +01:00\"}";
+ User returnedUser = objectMapper.readValue(jsonString, User.class);
+
+ return returnedUser.getCreatedAt().toString();
+ }
+}
diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/offsetdatetime/OffsetDateTimeDeserializer.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/offsetdatetime/OffsetDateTimeDeserializer.java
new file mode 100644
index 0000000000..a76d598b8f
--- /dev/null
+++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/offsetdatetime/OffsetDateTimeDeserializer.java
@@ -0,0 +1,24 @@
+package com.baeldung.offsetdatetime;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+
+import java.io.IOException;
+import java.time.OffsetDateTime;
+import java.time.format.DateTimeFormatter;
+
+public class OffsetDateTimeDeserializer extends JsonDeserializer {
+ private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter
+ .ofPattern("dd-MM-yyyy HH:mm:ss XXX");
+
+ @Override
+ public OffsetDateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
+ throws IOException {
+ String dateAsString = jsonParser.getText();
+ if (dateAsString == null) {
+ throw new IOException("OffsetDateTime argument is null.");
+ }
+ return OffsetDateTime.parse(dateAsString, DATE_TIME_FORMATTER);
+ }
+}
\ No newline at end of file
diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/offsetdatetime/OffsetDateTimeSerializer.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/offsetdatetime/OffsetDateTimeSerializer.java
new file mode 100644
index 0000000000..8821f37e8e
--- /dev/null
+++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/offsetdatetime/OffsetDateTimeSerializer.java
@@ -0,0 +1,23 @@
+package com.baeldung.offsetdatetime;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+import java.io.IOException;
+import java.time.OffsetDateTime;
+import java.time.format.DateTimeFormatter;
+
+public class OffsetDateTimeSerializer extends JsonSerializer {
+ private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter
+ .ofPattern("dd-MM-yyyy HH:mm:ss XXX");
+
+ @Override
+ public void serialize(OffsetDateTime value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
+ throws IOException {
+ if (value == null) {
+ throw new IOException("OffsetDateTime argument is null.");
+ }
+ jsonGenerator.writeString(DATE_TIME_FORMATTER.format(value));
+ }
+}
\ No newline at end of file
diff --git a/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/offsetdatetime/User.java b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/offsetdatetime/User.java
new file mode 100644
index 0000000000..44978cac87
--- /dev/null
+++ b/jackson-modules/jackson-custom-conversions/src/main/java/com/baeldung/offsetdatetime/User.java
@@ -0,0 +1,18 @@
+package com.baeldung.offsetdatetime;
+
+import java.time.OffsetDateTime;
+
+public class User {
+ private OffsetDateTime createdAt;
+
+ public User() {
+ }
+
+ public OffsetDateTime getCreatedAt() {
+ return createdAt;
+ }
+
+ public void setCreatedAt(OffsetDateTime createdAt) {
+ this.createdAt = createdAt;
+ }
+}
\ No newline at end of file
diff --git a/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/offsetdatetime/MainUnitTest.java b/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/offsetdatetime/MainUnitTest.java
new file mode 100644
index 0000000000..553adc8fdf
--- /dev/null
+++ b/jackson-modules/jackson-custom-conversions/src/test/java/com/baeldung/offsetdatetime/MainUnitTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.offsetdatetime;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+class MainUnitTest {
+
+ @Test
+ void givenUser_whenSerialized_thenCreatedDateIsSerialized() throws JsonProcessingException {
+ Assertions.assertEquals("{\"createdAt\":\"2021-09-30T15:30:00+01:00\"}", Main.serializeUser());
+ }
+
+ @Test
+ void givenUser_whenCustomSerialized_thenCreatedDateIsSerialized() throws JsonProcessingException {
+ Assertions.assertEquals("{\"createdAt\":\"30-09-2021 15:30:00 +01:00\"}", Main.customSerialize());
+ }
+
+ @Test
+ void givenUser_whenCustomDeserialized_thenCreatedDateIsDeserialized() throws JsonProcessingException {
+ Assertions.assertEquals("2021-09-30T15:30+01:00", Main.customDeserialize());
+ }
+}
\ No newline at end of file
diff --git a/jackson-modules/pom.xml b/jackson-modules/pom.xml
index 4163d1912f..531d5628f7 100644
--- a/jackson-modules/pom.xml
+++ b/jackson-modules/pom.xml
@@ -24,11 +24,6 @@
-
- com.fasterxml.jackson.core
- jackson-databind
- ${jackson.version}
-
com.fasterxml.jackson.dataformat
diff --git a/jenkins-modules/jenkins-jobs/README.md b/jenkins-modules/jenkins-jobs/README.md
index f58761997e..e6de0d57e0 100644
--- a/jenkins-modules/jenkins-jobs/README.md
+++ b/jenkins-modules/jenkins-jobs/README.md
@@ -4,3 +4,4 @@
- [Jenkins Pipeline – Change to Another Folder](https://www.baeldung.com/ops/jenkins-pipeline-change-to-another-folder)
- [How to Stop a Zombie Job on Jenkins Without Restarting the Server?](https://www.baeldung.com/ops/stop-zombie-job-on-jenkins-without-restarting-the-server)
- [Running Stages in Parallel With Jenkins Workflow / Pipeline](https://www.baeldung.com/ops/running-stages-in-parallel-jenkins-workflow-pipeline)
+- [Skip a Stage in a Jenkins Pipeline](https://www.baeldung.com/ops/jenkins-pipeline-skip-stage)
diff --git a/jersey/src/test/java/com/baeldung/jersey/server/EchoHeadersUnitTest.java b/jersey/src/test/java/com/baeldung/jersey/server/EchoHeadersIntegrationTest.java
similarity index 99%
rename from jersey/src/test/java/com/baeldung/jersey/server/EchoHeadersUnitTest.java
rename to jersey/src/test/java/com/baeldung/jersey/server/EchoHeadersIntegrationTest.java
index 96b5dfb260..e6f06383db 100644
--- a/jersey/src/test/java/com/baeldung/jersey/server/EchoHeadersUnitTest.java
+++ b/jersey/src/test/java/com/baeldung/jersey/server/EchoHeadersIntegrationTest.java
@@ -16,7 +16,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
import jakarta.ws.rs.core.Application;
import jakarta.ws.rs.core.Response;
-public class EchoHeadersUnitTest extends JerseyTest {
+public class EchoHeadersIntegrationTest extends JerseyTest {
private static final String SIMPLE_HEADER_KEY = "my-header-key";
private static final String SIMPLE_HEADER_VALUE = "my-header-value";
diff --git a/persistence-modules/r2dbc/src/test/resources/application.yml b/persistence-modules/r2dbc/src/test/resources/application.yml
index 0903bed6fb..f99f02c9c1 100644
--- a/persistence-modules/r2dbc/src/test/resources/application.yml
+++ b/persistence-modules/r2dbc/src/test/resources/application.yml
@@ -1,6 +1,8 @@
# R2DBC Test configuration
r2dbc:
url: r2dbc:h2:mem://./testdb
+ user: local
+ password: local
server:
port: 8080
@@ -24,6 +26,7 @@ spring:
user: local
password: local
locations: classpath:db/h2/migration
-
+ main:
+ allow-bean-definition-overriding: true
diff --git a/persistence-modules/spring-jpa-2/README.md b/persistence-modules/spring-jpa-2/README.md
index f9f259cdfa..c1068b6a39 100644
--- a/persistence-modules/spring-jpa-2/README.md
+++ b/persistence-modules/spring-jpa-2/README.md
@@ -7,4 +7,5 @@
- [The DAO with Spring and Hibernate](https://www.baeldung.com/persistence-layer-with-spring-and-hibernate)
- [Simplify the DAO with Spring and Java Generics](https://www.baeldung.com/simplifying-the-data-access-layer-with-spring-and-java-generics)
- [Multitenancy With Spring Data JPA](https://www.baeldung.com/multitenancy-with-spring-data-jpa)
+- [Remove Entity with Many-to-Many Relationship in JPA](https://www.baeldung.com/jpa-remove-entity-many-to-many)
- More articles: [[<-- prev]](/spring-jpa)
diff --git a/pom.xml b/pom.xml
index 89e687ada4..e0169c5b81 100644
--- a/pom.xml
+++ b/pom.xml
@@ -332,7 +332,21 @@
checker-plugin
- core-java-modules
+
+ core-java-modules/core-java
+ core-java-modules/core-java-8
+ core-java-modules/core-java-8-2
+ core-java-modules/core-java-8-datetime
+ core-java-modules/core-java-8-datetime-2
+ core-java-modules/core-java-sun
+ core-java-modules/core-java-security
+ core-java-modules/core-java-nio-2
+ core-java-modules/core-java-serialization
+ core-java-modules/core-java-lang
+ core-java-modules/core-java-lang-math-3
+ core-java-modules/core-java-collections-conversions-2
+ core-java-modules/core-java-streams-2
+
couchbase
@@ -521,7 +535,20 @@
checker-plugin
- core-java-modules
+ core-java-modules/core-java
+ core-java-modules/core-java-8
+ core-java-modules/core-java-8-2
+ core-java-modules/core-java-8-datetime
+ core-java-modules/core-java-8-datetime-2
+ core-java-modules/core-java-sun
+ core-java-modules/core-java-security
+ core-java-modules/core-java-nio-2
+ core-java-modules/core-java-serialization
+ core-java-modules/core-java-lang
+ core-java-modules/core-java-lang-math-3
+ core-java-modules/core-java-collections-conversions-2
+ core-java-modules/core-java-streams-2
+
couchbase
@@ -778,15 +805,8 @@
couchbase
core-groovy-modules
- core-java-modules/core-java-9
- core-java-modules/core-java-9-improvements
- core-java-modules/core-java-9-jigsaw
+ core-java-modules
- core-java-modules/core-java-9-streams
- core-java-modules/core-java-10
- core-java-modules/core-java-11
- core-java-modules/core-java-11-2
- core-java-modules/core-java-11-3
@@ -794,27 +814,6 @@
- core-java-modules/core-java-collections-set
- core-java-modules/core-java-collections-list-4
- core-java-modules/core-java-collections-array-list
- core-java-modules/core-java-collections-maps-4
- core-java-modules/core-java-collections-maps-5
- core-java-modules/core-java-concurrency-simple
- core-java-modules/core-java-date-operations-1
- core-java-modules/core-java-datetime-conversion
- core-java-modules/core-java-datetime-string
- core-java-modules/core-java-io-conversions-2
- core-java-modules/core-java-jpms
- core-java-modules/core-java-os
- core-java-modules/core-java-streams-4
- core-java-modules/core-java-string-algorithms-3
- core-java-modules/core-java-string-operations-3
- core-java-modules/core-java-string-operations-4
- core-java-modules/core-java-string-operations-5
- core-java-modules/core-java-time-measurements
- core-java-modules/core-java-networking-3
- core-java-modules/core-java-strings
- core-java-modules/core-java-httpclient
custom-pmd
spring-core-6
data-structures
@@ -956,7 +955,7 @@
xstream
webrtc
persistence-modules/java-mongodb
-
+
messaging-modules
persistence-modules/questdb
@@ -1050,15 +1049,9 @@
couchbase
core-groovy-modules
- core-java-modules/core-java-9
- core-java-modules/core-java-9-improvements
- core-java-modules/core-java-9-jigsaw
+
+ core-java-modules
- core-java-modules/core-java-9-streams
- core-java-modules/core-java-10
- core-java-modules/core-java-11
- core-java-modules/core-java-11-2
- core-java-modules/core-java-11-3
@@ -1066,27 +1059,6 @@
- core-java-modules/core-java-collections-set
- core-java-modules/core-java-collections-list-4
- core-java-modules/core-java-collections-array-list
- core-java-modules/core-java-collections-maps-4
- core-java-modules/core-java-collections-maps-5
- core-java-modules/core-java-concurrency-simple
- core-java-modules/core-java-date-operations-1
- core-java-modules/core-java-datetime-conversion
- core-java-modules/core-java-datetime-string
- core-java-modules/core-java-io-conversions-2
- core-java-modules/core-java-jpms
- core-java-modules/core-java-os
- core-java-modules/core-java-streams-4
- core-java-modules/core-java-string-algorithms-3
- core-java-modules/core-java-string-operations-3
- core-java-modules/core-java-string-operations-4
- core-java-modules/core-java-string-operations-5
- core-java-modules/core-java-time-measurements
- core-java-modules/core-java-networking-3
- core-java-modules/core-java-strings
- core-java-modules/core-java-httpclient
spring-aop
spring-aop-2
custom-pmd
@@ -1232,7 +1204,7 @@
xstream
webrtc
persistence-modules/java-mongodb
- libraries-2
+ libraries-2
messaging-modules
persistence-modules/questdb
diff --git a/spring-boot-modules/spring-boot-3/README.md b/spring-boot-modules/spring-boot-3/README.md
index 22a3311cfd..be95ce2830 100644
--- a/spring-boot-modules/spring-boot-3/README.md
+++ b/spring-boot-modules/spring-boot-3/README.md
@@ -5,3 +5,4 @@
- [Singleton Design Pattern vs Singleton Beans in Spring Boot](https://www.baeldung.com/spring-boot-singleton-vs-beans)
- [Migrate Application From Spring Boot 2 to Spring Boot 3](https://www.baeldung.com/spring-boot-3-migration)
- [Using Java Records with JPA](https://www.baeldung.com/spring-jpa-java-records)
+- [HTTP Interface in Spring 6](https://www.baeldung.com/spring-6-http-interface)
diff --git a/spring-boot-modules/spring-boot-3/pom.xml b/spring-boot-modules/spring-boot-3/pom.xml
index 685df233ba..03740e805f 100644
--- a/spring-boot-modules/spring-boot-3/pom.xml
+++ b/spring-boot-modules/spring-boot-3/pom.xml
@@ -32,6 +32,20 @@
org.springframework.boot
spring-boot-starter-data-jpa
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+
+
+ org.mock-server
+ mockserver-netty
+ ${mockserver.version}
+
+
+ org.mock-server
+ mockserver-client-java
+ ${mockserver.version}
+
com.h2database
h2
@@ -125,7 +139,7 @@
2.0.0
3.0.0-M7
com.baeldung.sample.TodoApplication
-
+ 5.14.0
\ No newline at end of file
diff --git a/spring-core-6/src/main/java/com/baeldung/httpinterface/Book.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/httpinterface/Book.java
similarity index 100%
rename from spring-core-6/src/main/java/com/baeldung/httpinterface/Book.java
rename to spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/httpinterface/Book.java
diff --git a/spring-core-6/src/main/java/com/baeldung/httpinterface/BooksClient.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/httpinterface/BooksClient.java
similarity index 100%
rename from spring-core-6/src/main/java/com/baeldung/httpinterface/BooksClient.java
rename to spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/httpinterface/BooksClient.java
diff --git a/spring-core-6/src/main/java/com/baeldung/httpinterface/BooksService.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/httpinterface/BooksService.java
similarity index 85%
rename from spring-core-6/src/main/java/com/baeldung/httpinterface/BooksService.java
rename to spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/httpinterface/BooksService.java
index a9cf6ec58a..a70d412dd2 100644
--- a/spring-core-6/src/main/java/com/baeldung/httpinterface/BooksService.java
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/httpinterface/BooksService.java
@@ -15,12 +15,12 @@ interface BooksService {
List getBooks();
@GetExchange("/books/{id}")
- Book getBook(@PathVariable long id);
+ Book getBook(@PathVariable("id") long id);
@PostExchange("/books")
Book saveBook(@RequestBody Book book);
@DeleteExchange("/books/{id}")
- ResponseEntity deleteBook(@PathVariable long id);
+ ResponseEntity deleteBook(@PathVariable("id") long id);
}
diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/httpinterface/BooksServiceMockServerUnitTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/httpinterface/BooksServiceMockServerUnitTest.java
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/httpinterface/BooksServiceMockitoUnitTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/httpinterface/BooksServiceMockitoUnitTest.java
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/spring-core-6/src/test/java/com/baeldung/httpinterface/MyServiceException.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/httpinterface/MyServiceException.java
similarity index 100%
rename from spring-core-6/src/test/java/com/baeldung/httpinterface/MyServiceException.java
rename to spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/httpinterface/MyServiceException.java
diff --git a/spring-boot-modules/spring-boot-environment/README.md b/spring-boot-modules/spring-boot-environment/README.md
index 687322938e..c3e1866491 100644
--- a/spring-boot-modules/spring-boot-environment/README.md
+++ b/spring-boot-modules/spring-boot-environment/README.md
@@ -7,3 +7,4 @@ This module contains articles about configuring the Spring Boot `Environment`
- [Spring Properties File Outside jar](https://www.baeldung.com/spring-properties-file-outside-jar)
- [Get the Running Port in Spring Boot](https://www.baeldung.com/spring-boot-running-port)
- [Environment Variable Prefixes in Spring Boot 2.5](https://www.baeldung.com/spring-boot-env-variable-prefixes)
+ - [Spring Profiles](http://www.baeldung.com/spring-profiles)
diff --git a/spring-boot-modules/spring-boot-environment/pom.xml b/spring-boot-modules/spring-boot-environment/pom.xml
index 3ea591f561..013156fa7f 100644
--- a/spring-boot-modules/spring-boot-environment/pom.xml
+++ b/spring-boot-modules/spring-boot-environment/pom.xml
@@ -133,8 +133,23 @@
+
+ dev
+
+ true
+
+
+ dev
+
+
+
+ prod
+
+ prod
+
+
-
+
2.2
3.1.7
diff --git a/spring-core-2/src/main/java/com/baeldung/profiles/DatasourceConfig.java b/spring-boot-modules/spring-boot-environment/src/main/java/com/baeldung/profiles/DatasourceConfig.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/profiles/DatasourceConfig.java
rename to spring-boot-modules/spring-boot-environment/src/main/java/com/baeldung/profiles/DatasourceConfig.java
diff --git a/spring-core-2/src/main/java/com/baeldung/profiles/DevDatasourceConfig.java b/spring-boot-modules/spring-boot-environment/src/main/java/com/baeldung/profiles/DevDatasourceConfig.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/profiles/DevDatasourceConfig.java
rename to spring-boot-modules/spring-boot-environment/src/main/java/com/baeldung/profiles/DevDatasourceConfig.java
diff --git a/spring-core-2/src/main/java/com/baeldung/profiles/ProductionDatasourceConfig.java b/spring-boot-modules/spring-boot-environment/src/main/java/com/baeldung/profiles/ProductionDatasourceConfig.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/profiles/ProductionDatasourceConfig.java
rename to spring-boot-modules/spring-boot-environment/src/main/java/com/baeldung/profiles/ProductionDatasourceConfig.java
diff --git a/spring-core-2/src/main/java/com/baeldung/profiles/ProfileManager.java b/spring-boot-modules/spring-boot-environment/src/main/java/com/baeldung/profiles/ProfileManager.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/profiles/ProfileManager.java
rename to spring-boot-modules/spring-boot-environment/src/main/java/com/baeldung/profiles/ProfileManager.java
diff --git a/spring-core-2/src/main/java/com/baeldung/profiles/SpringProfilesConfig.java b/spring-boot-modules/spring-boot-environment/src/main/java/com/baeldung/profiles/SpringProfilesConfig.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/profiles/SpringProfilesConfig.java
rename to spring-boot-modules/spring-boot-environment/src/main/java/com/baeldung/profiles/SpringProfilesConfig.java
diff --git a/spring-boot-modules/spring-boot-environment/src/main/resources/application.properties b/spring-boot-modules/spring-boot-environment/src/main/resources/application.properties
index 4ffb414e92..8333184f1e 100644
--- a/spring-boot-modules/spring-boot-environment/src/main/resources/application.properties
+++ b/spring-boot-modules/spring-boot-environment/src/main/resources/application.properties
@@ -4,4 +4,34 @@ management.metrics.enable.jvm=true
management.endpoint.restart.enabled=true
spring.datasource.tomcat.jmx-enabled=false
management.endpoint.shutdown.enabled=true
-spring.config.import=file:./additional.properties,optional:file:/Users/home/config/jdbc.properties
\ No newline at end of file
+spring.config.import=file:./additional.properties,optional:file:/Users/home/config/jdbc.properties
+
+#---
+spring.profiles.active=@spring.profiles.active@
+
+my.prop=used-always-in-all-profiles
+
+#---
+spring.config.activate.on-profile=dev
+#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+#spring.datasource.url=jdbc:mysql://localhost:3306/db
+#spring.datasource.username=root
+#spring.datasource.password=root
+
+#---
+spring.config.activate.on-profile=production
+#spring.datasource.driver-class-name=org.h2.Driver
+#spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
+#spring.datasource.username=sa
+#spring.datasource.password=sa
+
+#---
+spring.profiles.group.production=proddb,prodquartz
+
+#---
+spring.config.activate.on-profile=proddb
+db=url_to_production_db
+
+#---
+spring.config.activate.on-profile=prodquartz
+quartz=url_to_quartz_scheduler
\ No newline at end of file
diff --git a/spring-core-2/src/main/resources/springProfiles-config.xml b/spring-boot-modules/spring-boot-environment/src/main/resources/springProfiles-config.xml
similarity index 100%
rename from spring-core-2/src/main/resources/springProfiles-config.xml
rename to spring-boot-modules/spring-boot-environment/src/main/resources/springProfiles-config.xml
diff --git a/spring-core-2/src/test/java/com/baeldung/profiles/DevProfileWithAnnotationIntegrationTest.java b/spring-boot-modules/spring-boot-environment/src/test/java/com/baeldung/profiles/DevProfileWithAnnotationIntegrationTest.java
similarity index 100%
rename from spring-core-2/src/test/java/com/baeldung/profiles/DevProfileWithAnnotationIntegrationTest.java
rename to spring-boot-modules/spring-boot-environment/src/test/java/com/baeldung/profiles/DevProfileWithAnnotationIntegrationTest.java
diff --git a/spring-core-2/src/test/java/com/baeldung/profiles/ProductionProfileWithAnnotationIntegrationTest.java b/spring-boot-modules/spring-boot-environment/src/test/java/com/baeldung/profiles/ProductionProfileWithAnnotationIntegrationTest.java
similarity index 100%
rename from spring-core-2/src/test/java/com/baeldung/profiles/ProductionProfileWithAnnotationIntegrationTest.java
rename to spring-boot-modules/spring-boot-environment/src/test/java/com/baeldung/profiles/ProductionProfileWithAnnotationIntegrationTest.java
diff --git a/spring-core-2/src/test/java/com/baeldung/profiles/SpringProfilesWithMavenPropertiesIntegrationTest.java b/spring-boot-modules/spring-boot-environment/src/test/java/com/baeldung/profiles/SpringProfilesWithMavenPropertiesIntegrationTest.java
similarity index 100%
rename from spring-core-2/src/test/java/com/baeldung/profiles/SpringProfilesWithMavenPropertiesIntegrationTest.java
rename to spring-boot-modules/spring-boot-environment/src/test/java/com/baeldung/profiles/SpringProfilesWithMavenPropertiesIntegrationTest.java
diff --git a/spring-core-2/src/test/java/com/baeldung/profiles/SpringProfilesWithXMLIntegrationTest.java b/spring-boot-modules/spring-boot-environment/src/test/java/com/baeldung/profiles/SpringProfilesWithXMLIntegrationTest.java
similarity index 100%
rename from spring-core-2/src/test/java/com/baeldung/profiles/SpringProfilesWithXMLIntegrationTest.java
rename to spring-boot-modules/spring-boot-environment/src/test/java/com/baeldung/profiles/SpringProfilesWithXMLIntegrationTest.java
diff --git a/spring-boot-modules/spring-boot-properties-3/README.md b/spring-boot-modules/spring-boot-properties-3/README.md
index 77c6815649..37b63abb84 100644
--- a/spring-boot-modules/spring-boot-properties-3/README.md
+++ b/spring-boot-modules/spring-boot-properties-3/README.md
@@ -10,3 +10,5 @@
- [Load Spring Boot Properties From a JSON File](https://www.baeldung.com/spring-boot-json-properties)
- [IntelliJ – Cannot Resolve Spring Boot Configuration Properties Error](https://www.baeldung.com/intellij-resolve-spring-boot-configuration-properties)
- [Log Properties in a Spring Boot Application](https://www.baeldung.com/spring-boot-log-properties)
+- [Using Environment Variables in Spring Boot’s application.properties](https://www.baeldung.com/spring-boot-properties-env-variables)
+- More articles: [[<-- prev]](../spring-boot-properties-2)
diff --git a/spring-core-6/src/main/java/com/baeldung/envvariables/BaeldungProperties.java b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/envvariables/BaeldungProperties.java
similarity index 86%
rename from spring-core-6/src/main/java/com/baeldung/envvariables/BaeldungProperties.java
rename to spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/envvariables/BaeldungProperties.java
index a41ac7a509..0e6e05a3c2 100644
--- a/spring-core-6/src/main/java/com/baeldung/envvariables/BaeldungProperties.java
+++ b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/envvariables/BaeldungProperties.java
@@ -1,20 +1,20 @@
-package com.baeldung.envvariables.valueinjection;
-
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.stereotype.Component;
-
-@Component
-@ConfigurationProperties(prefix = "baeldung")
-public class BaeldungProperties {
-
- private String presentation;
-
- public String getPresentation() {
- return presentation;
- }
-
- public void setPresentation(String presentation) {
- this.presentation = presentation;
- }
-
-}
+package com.baeldung.envvariables;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Component
+@ConfigurationProperties(prefix = "baeldung")
+public class BaeldungProperties {
+
+ private String presentation;
+
+ public String getPresentation() {
+ return presentation;
+ }
+
+ public void setPresentation(String presentation) {
+ this.presentation = presentation;
+ }
+
+}
diff --git a/spring-core-6/src/main/java/com/baeldung/envvariables/MyController.java b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/envvariables/MyController.java
similarity index 94%
rename from spring-core-6/src/main/java/com/baeldung/envvariables/MyController.java
rename to spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/envvariables/MyController.java
index 503ee47157..6afe9f2de1 100644
--- a/spring-core-6/src/main/java/com/baeldung/envvariables/MyController.java
+++ b/spring-boot-modules/spring-boot-properties-3/src/main/java/com/baeldung/envvariables/MyController.java
@@ -1,60 +1,60 @@
-package com.baeldung.envvariables.valueinjection;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.core.env.Environment;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-public class MyController {
-
- @Value("${environment.name}")
- private String environmentName;
-
- @Value("${java.home.and.environment}")
- private String javaHomeAndEnvironmentName;
-
- @Value("${thispropertydoesnotexist}")
- private String nonExistentProperty;
-
- @Value("${baeldung.presentation}")
- private String baeldungPresentation;
-
- @Autowired
- private Environment environment;
-
- @Autowired
- private BaeldungProperties baeldungProperties;
-
- @GetMapping("/environment_name")
- String getEnvironmentName_FromEnvironmentVariables() {
- return environmentName;
- }
-
- @GetMapping("/java_home_and_environment")
- String getJavaHomeAndEnvironmentName_FromEnvironmentVariables() {
- return javaHomeAndEnvironmentName;
- }
-
- @GetMapping("non_existent_property")
- String getNonexistentProperty_FromEnvironmentVariables() {
- return nonExistentProperty;
- }
-
- @GetMapping("baeldung_presentation_from_value")
- String getBaeldungPresentation_FromValue() {
- return baeldungPresentation;
- }
-
- @GetMapping("baeldung_presentation_from_environment")
- String getBaeldungPresentation_FromEnvironment() {
- return environment.getProperty("baeldung.presentation");
- }
-
- @GetMapping("baeldung_configuration_properties")
- String getBaeldungPresentation_FromConfigurationProperties() {
- return baeldungProperties.getPresentation();
- }
-
-}
+package com.baeldung.envvariables;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.env.Environment;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class MyController {
+
+ @Value("${environment.name}")
+ private String environmentName;
+
+ @Value("${java.home.and.environment}")
+ private String javaHomeAndEnvironmentName;
+
+ @Value("${thispropertydoesnotexist}")
+ private String nonExistentProperty;
+
+ @Value("${baeldung.presentation}")
+ private String baeldungPresentation;
+
+ @Autowired
+ private Environment environment;
+
+ @Autowired
+ private BaeldungProperties baeldungProperties;
+
+ @GetMapping("/environment_name")
+ String getEnvironmentName_FromEnvironmentVariables() {
+ return environmentName;
+ }
+
+ @GetMapping("/java_home_and_environment")
+ String getJavaHomeAndEnvironmentName_FromEnvironmentVariables() {
+ return javaHomeAndEnvironmentName;
+ }
+
+ @GetMapping("non_existent_property")
+ String getNonexistentProperty_FromEnvironmentVariables() {
+ return nonExistentProperty;
+ }
+
+ @GetMapping("baeldung_presentation_from_value")
+ String getBaeldungPresentation_FromValue() {
+ return baeldungPresentation;
+ }
+
+ @GetMapping("baeldung_presentation_from_environment")
+ String getBaeldungPresentation_FromEnvironment() {
+ return environment.getProperty("baeldung.presentation");
+ }
+
+ @GetMapping("baeldung_configuration_properties")
+ String getBaeldungPresentation_FromConfigurationProperties() {
+ return baeldungProperties.getPresentation();
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.properties b/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.properties
index a079837942..541183a186 100644
--- a/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.properties
+++ b/spring-boot-modules/spring-boot-properties-3/src/main/resources/application.properties
@@ -26,4 +26,9 @@ spring.config.activate.on-profile=multidocument-prod
spring.datasource.password=password
spring.datasource.url=jdbc:h2:prod
spring.datasource.username=prodUser
-bael.property=prodValue
\ No newline at end of file
+bael.property=prodValue
+#---
+environment.name=${OS}
+java.home.and.environment=${JAVA_HOME}+${OS}
+not.existing.system.property=${thispropertydoesnotexist}
+baeldung.presentation=${HELLO_BAELDUNG}. Java is installed in the folder: ${JAVA_HOME}
\ No newline at end of file
diff --git a/spring-core-6/src/test/java/com/baeldung/envvariables/MyControllerIntegrationTest.java b/spring-boot-modules/spring-boot-properties-3/src/test/java/com/baeldung/envvariables/MyControllerIntegrationTest.java
similarity index 95%
rename from spring-core-6/src/test/java/com/baeldung/envvariables/MyControllerIntegrationTest.java
rename to spring-boot-modules/spring-boot-properties-3/src/test/java/com/baeldung/envvariables/MyControllerIntegrationTest.java
index b3ee2c7c46..527acd5dfc 100644
--- a/spring-core-6/src/test/java/com/baeldung/envvariables/MyControllerIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-properties-3/src/test/java/com/baeldung/envvariables/MyControllerIntegrationTest.java
@@ -1,36 +1,36 @@
-package com.baeldung.envvariables.valueinjection;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.web.servlet.MockMvc;
-
-@SpringBootTest(classes = MyController.class)
-@AutoConfigureMockMvc
-public class MyControllerIntegrationTest {
-
- @Autowired
- private MockMvc mockMvc;
-
- /** NB : these tests are commented out because they are environment dependent
- * If you want to run one of them on your machine, follow the instruction above it
- *
- * expects the value of your system environment property 'OS' (it is already defined at least in Windows_NT)
- @Test void givenExistingSystemProperty_whenInjected_thenHasSystemPropertyValue() throws Exception {
- mockMvc.perform(get("/environment_name"))
- .andExpect(content().string(equalTo("Windows_NT")));
- }
-
- * expects the value of the JAVA_HOME environment variable (you need to define it if you haven't yet), with a + and the 'OS' environment property in the end
- @Test void givenCombinationOfSystemPropertyAndEnvironmentVariable_whenInjected_thenHasExpectedValue() throws Exception {
- mockMvc.perform(get("/java_home_and_environment"))
- .andExpect(content().string(equalTo("C:\\Program Files\\Java\\jdk-11.0.14+Windows_NT")));
- }
-
- * expects the content to be ${thispropertydoesnotexist} ; if you have defined an environment property called thispropertydoesnotexist, it would fail
- @Test void givenNonExistentProperty_whenInjected_thenKeepsTheStringValue() throws Exception {
- mockMvc.perform(get("/non_existent_property"))
- .andExpect(content().string(equalTo("${thispropertydoesnotexist}")));
- }
- */
-}
+package com.baeldung.envvariables;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.web.servlet.MockMvc;
+
+@SpringBootTest(classes = MyController.class)
+@AutoConfigureMockMvc
+public class MyControllerIntegrationTest {
+
+ @Autowired
+ private MockMvc mockMvc;
+
+ /** NB : these tests are commented out because they are environment dependent
+ * If you want to run one of them on your machine, follow the instruction above it
+ *
+ * expects the value of your system environment property 'OS' (it is already defined at least in Windows_NT)
+ @Test void givenExistingSystemProperty_whenInjected_thenHasSystemPropertyValue() throws Exception {
+ mockMvc.perform(get("/environment_name"))
+ .andExpect(content().string(equalTo("Windows_NT")));
+ }
+
+ * expects the value of the JAVA_HOME environment variable (you need to define it if you haven't yet), with a + and the 'OS' environment property in the end
+ @Test void givenCombinationOfSystemPropertyAndEnvironmentVariable_whenInjected_thenHasExpectedValue() throws Exception {
+ mockMvc.perform(get("/java_home_and_environment"))
+ .andExpect(content().string(equalTo("C:\\Program Files\\Java\\jdk-11.0.14+Windows_NT")));
+ }
+
+ * expects the content to be ${thispropertydoesnotexist} ; if you have defined an environment property called thispropertydoesnotexist, it would fail
+ @Test void givenNonExistentProperty_whenInjected_thenKeepsTheStringValue() throws Exception {
+ mockMvc.perform(get("/non_existent_property"))
+ .andExpect(content().string(equalTo("${thispropertydoesnotexist}")));
+ }
+ */
+}
diff --git a/spring-boot-modules/spring-boot-validation/README.md b/spring-boot-modules/spring-boot-validation/README.md
index 93b6e7d2d1..f20f846b60 100644
--- a/spring-boot-modules/spring-boot-validation/README.md
+++ b/spring-boot-modules/spring-boot-validation/README.md
@@ -2,3 +2,4 @@
- [Spring Validation in the Service Layer](https://www.baeldung.com/spring-service-layer-validation)
- [Validation in Spring Boot](https://www.baeldung.com/spring-boot-bean-validation)
+- [Spring Null-Safety Annotations](https://www.baeldung.com/spring-null-safety-annotations)
\ No newline at end of file
diff --git a/spring-core-2/src/main/java/com/baeldung/nullibility/Person.java b/spring-boot-modules/spring-boot-validation/src/main/java/com/baeldung/nullibility/Person.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/nullibility/Person.java
rename to spring-boot-modules/spring-boot-validation/src/main/java/com/baeldung/nullibility/Person.java
diff --git a/spring-core-2/src/main/java/com/baeldung/nullibility/package-info.java b/spring-boot-modules/spring-boot-validation/src/main/java/com/baeldung/nullibility/package-info.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/nullibility/package-info.java
rename to spring-boot-modules/spring-boot-validation/src/main/java/com/baeldung/nullibility/package-info.java
diff --git a/spring-boot-rest/pom.xml b/spring-boot-rest/pom.xml
index fb5df4e68a..81c9ebbec8 100644
--- a/spring-boot-rest/pom.xml
+++ b/spring-boot-rest/pom.xml
@@ -20,6 +20,12 @@
org.springframework.boot
spring-boot-starter-web
+
+
+ tomcat-embed-el
+ org.apache.tomcat.embed
+
+
com.fasterxml.jackson.dataformat
@@ -42,37 +48,101 @@
org.springframework.boot
spring-boot-starter-data-jpa
+
+
+ jakarta.xml.bind-api
+ jakarta.xml.bind
+
+
+ txw2
+ org.glassfish.jaxb
+
+
org.springframework.boot
spring-boot-starter-data-rest
+
+
+ spring-boot-starter-web
+ org.springframework.boot
+
+
org.springframework.boot
spring-boot-starter-hateoas
+
+
+ spring-boot-starter-web
+ org.springframework.boot
+
+
com.google.guava
guava
${guava.version}
+
+
+ listenablefuture
+ com.google.guava
+
+
+ jsr305
+ com.google.code.findbugs
+
+
+ error_prone_annotations
+ com.google.errorprone
+
+
+ j2objc-annotations
+ com.google.j2objc
+
+
org.springframework.boot
spring-boot-starter-test
test
+
+
+ jakarta.xml.bind-api
+ jakarta.xml.bind
+
+
net.sourceforge.htmlunit
htmlunit
test
+
+
+ commons-logging
+ commons-logging
+
+
org.modelmapper
modelmapper
${modelmapper.version}
+
+ io.rest-assured
+ rest-assured
+ 3.3.0
+ provided
+
+
+ hamcrest-library
+ org.hamcrest
+
+
+
@@ -90,5 +160,4 @@
3.1.0
3.3.2
-
-
\ No newline at end of file
+
diff --git a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/exception/ProductControllerAdvice.java b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/exception/PriceControllerAdvice.java
similarity index 93%
rename from spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/exception/ProductControllerAdvice.java
rename to spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/exception/PriceControllerAdvice.java
index fe7789ecf5..4d01ab0f6d 100644
--- a/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/exception/ProductControllerAdvice.java
+++ b/spring-cloud-modules/spring-cloud-open-telemetry/spring-cloud-open-telemetry2/src/main/java/com/baeldung/opentelemetry/exception/PriceControllerAdvice.java
@@ -6,7 +6,7 @@ import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
-public class ProductControllerAdvice {
+public class PriceControllerAdvice {
@ExceptionHandler(PriceNotFoundException.class)
public ResponseEntity
-
-
- dev
-
- true
-
-
- dev
-
-
-
- prod
-
- prod
-
-
-
-
com.baeldung.sample.App
diff --git a/spring-core-2/src/main/resources/application.properties b/spring-core-2/src/main/resources/application.properties
index d482330b83..e69de29bb2 100644
--- a/spring-core-2/src/main/resources/application.properties
+++ b/spring-core-2/src/main/resources/application.properties
@@ -1,28 +0,0 @@
-spring.profiles.active=@spring.profiles.active@
-
-my.prop=used-always-in-all-profiles
-
-#---
-spring.config.activate.on-profile=dev
-spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
-spring.datasource.url=jdbc:mysql://localhost:3306/db
-spring.datasource.username=root
-spring.datasource.password=root
-
-#---
-spring.config.activate.on-profile=production
-spring.datasource.driver-class-name=org.h2.Driver
-spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
-spring.datasource.username=sa
-spring.datasource.password=sa
-
-#---
-spring.profiles.group.production=proddb,prodquartz
-
-#---
-spring.config.activate.on-profile=proddb
-db=url_to_production_db
-
-#---
-spring.config.activate.on-profile=prodquartz
-quartz=url_to_quartz_scheduler
\ No newline at end of file
diff --git a/spring-core-6/README.md b/spring-core-6/README.md
index af9fd7e32c..1879ff9a68 100644
--- a/spring-core-6/README.md
+++ b/spring-core-6/README.md
@@ -1,6 +1,5 @@
### Relevant Articles:
-- [Using Environment Variables in Spring Boot’s application.properties](https://www.baeldung.com/spring-boot-properties-env-variables)
- [Reinitialize Singleton Bean in Spring Context](https://www.baeldung.com/spring-reinitialize-singleton-bean)
-- [HTTP Interface in Spring 6](https://www.baeldung.com/spring-6-http-interface)
- [Getting the Current ApplicationContext in Spring](https://www.baeldung.com/spring-get-current-applicationcontext)
+- More articles: [[<-- prev]](../spring-core-5)
\ No newline at end of file
diff --git a/spring-core-6/pom.xml b/spring-core-6/pom.xml
index a3dda0374f..cc494b3a57 100644
--- a/spring-core-6/pom.xml
+++ b/spring-core-6/pom.xml
@@ -21,20 +21,6 @@
org.springframework.boot
spring-boot-starter-web
-
- org.springframework.boot
- spring-boot-starter-webflux
-
-
- org.mock-server
- mockserver-netty
- ${mockserver.version}
-
-
- org.mock-server
- mockserver-client-java
- ${mockserver.version}
-
org.springframework.boot
spring-boot-starter-test
@@ -104,7 +90,6 @@
UTF-8
17
17
- 5.14.0
\ No newline at end of file
diff --git a/spring-core-6/src/main/resources/application.properties b/spring-core-6/src/main/resources/application.properties
index 28a65dce32..6545cd1097 100644
--- a/spring-core-6/src/main/resources/application.properties
+++ b/spring-core-6/src/main/resources/application.properties
@@ -1,5 +1 @@
-environment.name=${OS}
-java.home.and.environment=${JAVA_HOME}+${OS}
-not.existing.system.property=${thispropertydoesnotexist}
-baeldung.presentation=${HELLO_BAELDUNG}. Java is installed in the folder: ${JAVA_HOME}
config.file.path=./spring-core-6/src/main/resources/config.properties
\ No newline at end of file
diff --git a/spring-core-6/src/test/java/com/baeldung/httpinterface/BooksServiceMockServerTest.java b/spring-core-6/src/test/java/com/baeldung/httpinterface/BooksServiceMockServerTest.java
deleted file mode 100644
index 22e00c16ae..0000000000
--- a/spring-core-6/src/test/java/com/baeldung/httpinterface/BooksServiceMockServerTest.java
+++ /dev/null
@@ -1,217 +0,0 @@
-package com.baeldung.httpinterface;
-
-import org.apache.http.HttpException;
-import org.apache.http.HttpStatus;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Test;
-import org.mockserver.client.MockServerClient;
-import org.mockserver.integration.ClientAndServer;
-import org.mockserver.configuration.Configuration;
-
-import java.io.IOException;
-import java.net.ServerSocket;
-import java.util.List;
-
-import org.mockserver.model.HttpRequest;
-import org.mockserver.model.MediaType;
-import org.mockserver.verify.VerificationTimes;
-import org.slf4j.event.Level;
-import org.springframework.http.HttpMethod;
-import org.springframework.http.HttpStatusCode;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.reactive.function.client.WebClient;
-import org.springframework.web.reactive.function.client.WebClientResponseException;
-import reactor.core.publisher.Mono;
-
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.mockserver.integration.ClientAndServer.startClientAndServer;
-import static org.mockserver.matchers.Times.exactly;
-import static org.mockserver.model.HttpRequest.request;
-import static org.mockserver.model.HttpResponse.response;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-class BooksServiceMockServerTest {
-
- private static final String SERVER_ADDRESS = "localhost";
- private static final String PATH = "/books";
-
- private static int serverPort;
- private static ClientAndServer mockServer;
- private static String serviceUrl;
-
- @BeforeAll
- static void startServer() throws IOException {
- serverPort = getFreePort();
- serviceUrl = "http://" + SERVER_ADDRESS + ":" + serverPort;
-
- Configuration config = Configuration.configuration().logLevel(Level.WARN);
- mockServer = startClientAndServer(config, serverPort);
-
- mockAllBooksRequest();
- mockBookByIdRequest();
- mockSaveBookRequest();
- mockDeleteBookRequest();
- }
-
- @AfterAll
- static void stopServer() {
- mockServer.stop();
- }
-
- @Test
- void givenMockedGetResponse_whenGetBooksServiceMethodIsCalled_thenTwoBooksAreReturned() {
- BooksClient booksClient = new BooksClient(WebClient.builder().baseUrl(serviceUrl).build());
- BooksService booksService = booksClient.getBooksService();
-
- List books = booksService.getBooks();
- assertEquals(2, books.size());
-
- mockServer.verify(
- HttpRequest.request()
- .withMethod(HttpMethod.GET.name())
- .withPath(PATH),
- VerificationTimes.exactly(1)
- );
- }
-
- @Test
- void givenMockedGetResponse_whenGetExistingBookServiceMethodIsCalled_thenCorrectBookIsReturned() {
- BooksClient booksClient = new BooksClient(WebClient.builder().baseUrl(serviceUrl).build());
- BooksService booksService = booksClient.getBooksService();
-
- Book book = booksService.getBook(1);
- assertEquals("Book_1", book.title());
-
- mockServer.verify(
- HttpRequest.request()
- .withMethod(HttpMethod.GET.name())
- .withPath(PATH + "/1"),
- VerificationTimes.exactly(1)
- );
- }
-
- @Test
- void givenMockedGetResponse_whenGetNonExistingBookServiceMethodIsCalled_thenCorrectBookIsReturned() {
- BooksClient booksClient = new BooksClient(WebClient.builder().baseUrl(serviceUrl).build());
- BooksService booksService = booksClient.getBooksService();
-
- assertThrows(WebClientResponseException.class, () -> booksService.getBook(9));
- }
-
- @Test
- void givenCustomErrorHandlerIsSet_whenGetNonExistingBookServiceMethodIsCalled_thenCustomExceptionIsThrown() {
- BooksClient booksClient = new BooksClient(WebClient.builder()
- .defaultStatusHandler(HttpStatusCode::isError, resp ->
- Mono.just(new MyServiceException("Custom exception")))
- .baseUrl(serviceUrl)
- .build());
-
- BooksService booksService = booksClient.getBooksService();
- assertThrows(MyServiceException.class, () -> booksService.getBook(9));
- }
-
- @Test
- void givenMockedPostResponse_whenSaveBookServiceMethodIsCalled_thenCorrectBookIsReturned() {
- BooksClient booksClient = new BooksClient(WebClient.builder().baseUrl(serviceUrl).build());
- BooksService booksService = booksClient.getBooksService();
-
- Book book = booksService.saveBook(new Book(3, "Book_3", "Author_3", 2000));
- assertEquals("Book_3", book.title());
-
- mockServer.verify(
- HttpRequest.request()
- .withMethod(HttpMethod.POST.name())
- .withPath(PATH),
- VerificationTimes.exactly(1)
- );
- }
-
- @Test
- void givenMockedDeleteResponse_whenDeleteBookServiceMethodIsCalled_thenCorrectCodeIsReturned() {
- BooksClient booksClient = new BooksClient(WebClient.builder().baseUrl(serviceUrl).build());
- BooksService booksService = booksClient.getBooksService();
-
- ResponseEntity response = booksService.deleteBook(3);
- assertEquals(HttpStatusCode.valueOf(200), response.getStatusCode());
-
- mockServer.verify(
- HttpRequest.request()
- .withMethod(HttpMethod.DELETE.name())
- .withPath(PATH + "/3"),
- VerificationTimes.exactly(1)
- );
- }
-
- private static int getFreePort () throws IOException {
- try (ServerSocket serverSocket = new ServerSocket(0)) {
- return serverSocket.getLocalPort();
- }
- }
-
- private static void mockAllBooksRequest() {
- new MockServerClient(SERVER_ADDRESS, serverPort)
- .when(
- request()
- .withPath(PATH)
- .withMethod(HttpMethod.GET.name()),
- exactly(1)
- )
- .respond(
- response()
- .withStatusCode(HttpStatus.SC_OK)
- .withContentType(MediaType.APPLICATION_JSON)
- .withBody("[{\"id\":1,\"title\":\"Book_1\",\"author\":\"Author_1\",\"year\":1998},{\"id\":2,\"title\":\"Book_2\",\"author\":\"Author_2\",\"year\":1999}]")
- );
- }
-
- private static void mockBookByIdRequest() {
- new MockServerClient(SERVER_ADDRESS, serverPort)
- .when(
- request()
- .withPath(PATH + "/1")
- .withMethod(HttpMethod.GET.name()),
- exactly(1)
- )
- .respond(
- response()
- .withStatusCode(HttpStatus.SC_OK)
- .withContentType(MediaType.APPLICATION_JSON)
- .withBody("{\"id\":1,\"title\":\"Book_1\",\"author\":\"Author_1\",\"year\":1998}")
- );
- }
-
- private static void mockSaveBookRequest() {
- new MockServerClient(SERVER_ADDRESS, serverPort)
- .when(
- request()
- .withPath(PATH)
- .withMethod(HttpMethod.POST.name())
- .withContentType(MediaType.APPLICATION_JSON)
- .withBody("{\"id\":3,\"title\":\"Book_3\",\"author\":\"Author_3\",\"year\":2000}"),
- exactly(1)
- )
- .respond(
- response()
- .withStatusCode(HttpStatus.SC_OK)
- .withContentType(MediaType.APPLICATION_JSON)
- .withBody("{\"id\":3,\"title\":\"Book_3\",\"author\":\"Author_3\",\"year\":2000}")
- );
- }
-
- private static void mockDeleteBookRequest() {
- new MockServerClient(SERVER_ADDRESS, serverPort)
- .when(
- request()
- .withPath(PATH + "/3")
- .withMethod(HttpMethod.DELETE.name()),
- exactly(1)
- )
- .respond(
- response()
- .withStatusCode(HttpStatus.SC_OK)
- );
- }
-
-}
diff --git a/spring-core-6/src/test/java/com/baeldung/httpinterface/BooksServiceMockitoTest.java b/spring-core-6/src/test/java/com/baeldung/httpinterface/BooksServiceMockitoTest.java
deleted file mode 100644
index 7a82835ef3..0000000000
--- a/spring-core-6/src/test/java/com/baeldung/httpinterface/BooksServiceMockitoTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package com.baeldung.httpinterface;
-
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.Answers;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.junit.jupiter.MockitoExtension;
-import org.springframework.core.ParameterizedTypeReference;
-import org.springframework.http.HttpMethod;
-import org.springframework.http.HttpStatusCode;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.reactive.function.client.WebClient;
-import reactor.core.publisher.Mono;
-
-import static org.mockito.BDDMockito.*;
-
-import java.util.List;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-@ExtendWith(MockitoExtension.class)
-class BooksServiceMockitoTest {
-
- @Mock(answer = Answers.RETURNS_DEEP_STUBS)
- private WebClient webClient;
-
- @InjectMocks
- private BooksClient booksClient;
-
- @Test
- void givenMockedWebClientReturnsTwoBooks_whenGetBooksServiceMethodIsCalled_thenListOfTwoBooksIsReturned() {
- given(webClient.method(HttpMethod.GET)
- .uri(anyString(), anyMap())
- .retrieve()
- .bodyToMono(new ParameterizedTypeReference>(){}))
- .willReturn(Mono.just(List.of(
- new Book(1,"Book_1", "Author_1", 1998),
- new Book(2, "Book_2", "Author_2", 1999)
- )));
-
- BooksService booksService = booksClient.getBooksService();
- List books = booksService.getBooks();
- assertEquals(2, books.size());
- }
-
- @Test
- void givenMockedWebClientReturnsBook_whenGetBookServiceMethodIsCalled_thenBookIsReturned() {
- given(webClient.method(HttpMethod.GET)
- .uri(anyString(), anyMap())
- .retrieve()
- .bodyToMono(new ParameterizedTypeReference(){}))
- .willReturn(Mono.just(new Book(1,"Book_1", "Author_1", 1998)));
-
- BooksService booksService = booksClient.getBooksService();
- Book book = booksService.getBook(1);
- assertEquals("Book_1", book.title());
- }
-
- @Test
- void givenMockedWebClientReturnsBook_whenSaveBookServiceMethodIsCalled_thenBookIsReturned() {
- given(webClient.method(HttpMethod.POST)
- .uri(anyString(), anyMap())
- .retrieve()
- .bodyToMono(new ParameterizedTypeReference(){}))
- .willReturn(Mono.just(new Book(3, "Book_3", "Author_3", 2000)));
-
- BooksService booksService = booksClient.getBooksService();
- Book book = booksService.saveBook(new Book(3, "Book_3", "Author_3", 2000));
- assertEquals("Book_3", book.title());
- }
-
- @Test
- void givenMockedWebClientReturnsOk_whenDeleteBookServiceMethodIsCalled_thenOkCodeIsReturned() {
- given(webClient.method(HttpMethod.DELETE)
- .uri(anyString(), anyMap())
- .retrieve()
- .toBodilessEntity()
- .block(any())
- .getStatusCode())
- .willReturn(HttpStatusCode.valueOf(200));
-
- BooksService booksService = booksClient.getBooksService();
- ResponseEntity response = booksService.deleteBook(3);
- assertEquals(HttpStatusCode.valueOf(200), response.getStatusCode());
- }
-
-}
diff --git a/spring-kafka/pom.xml b/spring-kafka/pom.xml
index 7b0bb0a8b7..c013be32e3 100644
--- a/spring-kafka/pom.xml
+++ b/spring-kafka/pom.xml
@@ -23,6 +23,16 @@
org.springframework.boot
spring-boot-starter-web
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+ 3.0.5
+
+
+ io.micrometer
+ micrometer-registry-prometheus
+ 1.10.5
+
org.springframework.kafka
spring-kafka
diff --git a/spring-kafka/src/main/java/com/baeldung/monitoring/LagAnalyzerApplication.java b/spring-kafka/src/main/java/com/baeldung/monitoring/LagAnalyzerApplication.java
index 9275151d50..d305af8c87 100644
--- a/spring-kafka/src/main/java/com/baeldung/monitoring/LagAnalyzerApplication.java
+++ b/spring-kafka/src/main/java/com/baeldung/monitoring/LagAnalyzerApplication.java
@@ -10,6 +10,7 @@ public class LagAnalyzerApplication {
public static void main(String[] args) {
SpringApplication.run(LagAnalyzerApplication.class, args);
- while (true) ;
+ while (true)
+ ;
}
}
diff --git a/spring-kafka/src/main/java/com/baeldung/monitoring/service/LagAnalyzerService.java b/spring-kafka/src/main/java/com/baeldung/monitoring/service/LagAnalyzerService.java
index b046f0b2c4..f8898b60d8 100644
--- a/spring-kafka/src/main/java/com/baeldung/monitoring/service/LagAnalyzerService.java
+++ b/spring-kafka/src/main/java/com/baeldung/monitoring/service/LagAnalyzerService.java
@@ -1,6 +1,7 @@
package com.baeldung.monitoring.service;
import com.baeldung.monitoring.util.MonitoringUtil;
+
import org.apache.kafka.clients.admin.AdminClient;
import org.apache.kafka.clients.admin.AdminClientConfig;
import org.apache.kafka.clients.admin.ListConsumerGroupOffsetsResult;
@@ -27,36 +28,38 @@ public class LagAnalyzerService {
private final KafkaConsumer consumer;
@Autowired
- public LagAnalyzerService(
- @Value("${monitor.kafka.bootstrap.config}") String bootstrapServerConfig) {
+ public LagAnalyzerService(@Value("${monitor.kafka.bootstrap.config}") String bootstrapServerConfig) {
adminClient = getAdminClient(bootstrapServerConfig);
consumer = getKafkaConsumer(bootstrapServerConfig);
}
- public Map analyzeLag(
- String groupId)
- throws ExecutionException, InterruptedException {
+ public Map analyzeLag(String groupId)
+ throws ExecutionException, InterruptedException {
Map consumerGrpOffsets = getConsumerGrpOffsets(groupId);
Map producerOffsets = getProducerOffsets(consumerGrpOffsets);
Map lags = computeLags(consumerGrpOffsets, producerOffsets);
for (Map.Entry lagEntry : lags.entrySet()) {
- String topic = lagEntry.getKey().topic();
- int partition = lagEntry.getKey().partition();
+ String topic = lagEntry.getKey()
+ .topic();
+ int partition = lagEntry.getKey()
+ .partition();
Long lag = lagEntry.getValue();
- LOGGER.info("Time={} | Lag for topic = {}, partition = {} is {}",
- MonitoringUtil.time(),
- topic,
- partition,
- lag);
+ LOGGER.info("Time={} | Lag for topic = {}, partition = {}, groupId = {} is {}",
+ MonitoringUtil.time(),
+ topic,
+ partition,
+ groupId,
+ lag);
}
return lags;
}
public Map getConsumerGrpOffsets(String groupId)
- throws ExecutionException, InterruptedException {
+ throws ExecutionException, InterruptedException {
ListConsumerGroupOffsetsResult info = adminClient.listConsumerGroupOffsets(groupId);
- Map metadataMap
- = info.partitionsToOffsetAndMetadata().get();
+ Map metadataMap = info
+ .partitionsToOffsetAndMetadata()
+ .get();
Map groupOffset = new HashMap<>();
for (Map.Entry entry : metadataMap.entrySet()) {
TopicPartition key = entry.getKey();
@@ -66,8 +69,7 @@ public class LagAnalyzerService {
return groupOffset;
}
- private Map getProducerOffsets(
- Map consumerGrpOffset) {
+ private Map getProducerOffsets(Map consumerGrpOffset) {
List topicPartitions = new LinkedList<>();
for (Map.Entry entry : consumerGrpOffset.entrySet()) {
TopicPartition key = entry.getKey();
@@ -77,9 +79,9 @@ public class LagAnalyzerService {
}
public Map computeLags(
- Map consumerGrpOffsets,
- Map producerOffsets) {
- Map lags = new HashMap<>();
+ Map consumerGrpOffsets,
+ Map producerOffsets) {
+ Map lags = new HashMap<>();
for (Map.Entry entry : consumerGrpOffsets.entrySet()) {
Long producerOffset = producerOffsets.get(entry.getKey());
Long consumerOffset = consumerGrpOffsets.get(entry.getKey());
@@ -91,15 +93,24 @@ public class LagAnalyzerService {
private AdminClient getAdminClient(String bootstrapServerConfig) {
Properties config = new Properties();
- config.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServerConfig);
+ config.put(
+ AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG,
+ bootstrapServerConfig);
return AdminClient.create(config);
}
- private KafkaConsumer getKafkaConsumer(String bootstrapServerConfig) {
+ private KafkaConsumer getKafkaConsumer(
+ String bootstrapServerConfig) {
Properties properties = new Properties();
- properties.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServerConfig);
- properties.setProperty(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
- properties.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
+ properties.setProperty(
+ ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,
+ bootstrapServerConfig);
+ properties.setProperty(
+ ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,
+ StringDeserializer.class.getName());
+ properties.setProperty(
+ ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,
+ StringDeserializer.class.getName());
return new KafkaConsumer<>(properties);
}
}
diff --git a/spring-kafka/src/main/java/com/baeldung/monitoring/service/LiveLagAnalyzerService.java b/spring-kafka/src/main/java/com/baeldung/monitoring/service/LiveLagAnalyzerService.java
index a20b9e9a0c..7035bf73bd 100644
--- a/spring-kafka/src/main/java/com/baeldung/monitoring/service/LiveLagAnalyzerService.java
+++ b/spring-kafka/src/main/java/com/baeldung/monitoring/service/LiveLagAnalyzerService.java
@@ -15,8 +15,8 @@ public class LiveLagAnalyzerService {
@Autowired
public LiveLagAnalyzerService(
- LagAnalyzerService lagAnalyzerService,
- @Value(value = "${monitor.kafka.consumer.groupid}") String groupId) {
+ LagAnalyzerService lagAnalyzerService,
+ @Value(value = "${monitor.kafka.consumer.groupid}") String groupId) {
this.lagAnalyzerService = lagAnalyzerService;
this.groupId = groupId;
}
diff --git a/spring-kafka/src/main/java/com/baeldung/monitoring/simulation/ConsumerSimulator.java b/spring-kafka/src/main/java/com/baeldung/monitoring/simulation/ConsumerSimulator.java
index 2d376432e5..171c17a282 100644
--- a/spring-kafka/src/main/java/com/baeldung/monitoring/simulation/ConsumerSimulator.java
+++ b/spring-kafka/src/main/java/com/baeldung/monitoring/simulation/ConsumerSimulator.java
@@ -7,10 +7,9 @@ import org.springframework.stereotype.Service;
@Service
public class ConsumerSimulator {
- @KafkaListener(
- topics = "${monitor.topic.name}",
- containerFactory = "kafkaListenerContainerFactory",
- autoStartup = "${monitor.consumer.simulate}")
+ @KafkaListener(topics = "${monitor.topic.name}",
+ containerFactory = "kafkaListenerContainerFactory",
+ autoStartup = "${monitor.consumer.simulate}")
public void listenGroup(String message) throws InterruptedException {
Thread.sleep(10L);
}
diff --git a/spring-kafka/src/main/java/com/baeldung/monitoring/simulation/KafkaConsumerConfig.java b/spring-kafka/src/main/java/com/baeldung/monitoring/simulation/KafkaConsumerConfig.java
index a4a8847bcf..9d5160e713 100644
--- a/spring-kafka/src/main/java/com/baeldung/monitoring/simulation/KafkaConsumerConfig.java
+++ b/spring-kafka/src/main/java/com/baeldung/monitoring/simulation/KafkaConsumerConfig.java
@@ -2,53 +2,54 @@ package com.baeldung.monitoring.simulation;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.common.serialization.StringDeserializer;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.PropertySource;
import org.springframework.kafka.annotation.EnableKafka;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.core.ConsumerFactory;
import org.springframework.kafka.core.DefaultKafkaConsumerFactory;
+import org.springframework.kafka.core.MicrometerConsumerListener;
+import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
+import io.micrometer.core.instrument.MeterRegistry;
+
@EnableKafka
-@Configuration
+@Component
public class KafkaConsumerConfig {
@Value(value = "${monitor.kafka.bootstrap.config}")
private String bootstrapAddress;
@Value(value = "${monitor.kafka.consumer.groupid}")
private String groupId;
- @Value(value = "${monitor.kafka.consumer.groupid.simulate}")
- private String simulateGroupId;
- @Value(value = "${monitor.producer.simulate}")
- private boolean enabled;
- public ConsumerFactory consumerFactory(String groupId) {
+ @Autowired
+ private MeterRegistry meterRegistry;
+
+ @Bean
+ public ConsumerFactory consumerFactory() {
Map props = new HashMap<>();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress);
- if (enabled) {
- props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
- } else {
- props.put(ConsumerConfig.GROUP_ID_CONFIG, simulateGroupId);
- }
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, 0);
- return new DefaultKafkaConsumerFactory<>(props);
+ props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
+ DefaultKafkaConsumerFactory consumerFactory = new DefaultKafkaConsumerFactory<>(props);
+ consumerFactory.addListener(new MicrometerConsumerListener<>(this.meterRegistry));
+ return consumerFactory;
}
@Bean
- public ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory() {
- ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory<>();
- if (enabled) {
- factory.setConsumerFactory(consumerFactory(groupId));
- } else {
- factory.setConsumerFactory(consumerFactory(simulateGroupId));
- }
- return factory;
+ public ConcurrentKafkaListenerContainerFactory
+ kafkaListenerContainerFactory(@Qualifier("consumerFactory") ConsumerFactory consumerFactory) {
+ ConcurrentKafkaListenerContainerFactory listenerContainerFactory =
+ new ConcurrentKafkaListenerContainerFactory<>();
+ listenerContainerFactory.setConsumerFactory(consumerFactory);
+ return listenerContainerFactory;
}
}
diff --git a/spring-kafka/src/main/java/com/baeldung/monitoring/simulation/ProducerSimulator.java b/spring-kafka/src/main/java/com/baeldung/monitoring/simulation/ProducerSimulator.java
index 30476ff7ec..ad4a006809 100644
--- a/spring-kafka/src/main/java/com/baeldung/monitoring/simulation/ProducerSimulator.java
+++ b/spring-kafka/src/main/java/com/baeldung/monitoring/simulation/ProducerSimulator.java
@@ -23,10 +23,9 @@ public class ProducerSimulator {
private final boolean enabled;
@Autowired
- public ProducerSimulator(
- KafkaTemplate kafkaTemplate,
- @Value(value = "${monitor.topic.name}") String topicName,
- @Value(value = "${monitor.producer.simulate}") String enabled) {
+ public ProducerSimulator(KafkaTemplate kafkaTemplate,
+ @Value(value = "${monitor.topic.name}") String topicName,
+ @Value(value = "${monitor.producer.simulate}") String enabled) {
this.kafkaTemplate = kafkaTemplate;
this.topicName = topicName;
this.enabled = BooleanUtils.toBoolean(enabled);
@@ -37,7 +36,9 @@ public class ProducerSimulator {
if (enabled) {
if (endTime.after(new Date())) {
String message = "msg-" + time();
- SendResult result = kafkaTemplate.send(topicName, message).get();
+ SendResult result = kafkaTemplate
+ .send(topicName, message)
+ .get();
}
}
}
diff --git a/spring-kafka/src/main/resources/application.properties b/spring-kafka/src/main/resources/application.properties
index c57537e2af..1a639a43fc 100644
--- a/spring-kafka/src/main/resources/application.properties
+++ b/spring-kafka/src/main/resources/application.properties
@@ -1,3 +1,4 @@
+server.port=8081
spring.kafka.bootstrap-servers=localhost:9092
message.topic.name=baeldung
long.message.topic.name=longMessage
@@ -15,3 +16,12 @@ monitor.consumer.simulate=true
monitor.kafka.consumer.groupid.simulate=baeldungGrpSimulate
test.topic=testtopic1
+
+
+management.endpoints.web.base-path=/actuator
+management.endpoints.web.exposure.include=*
+management.endpoint.health.show-details=always
+management.endpoint.metrics.enabled=true
+management.endpoint.prometheus.enabled=true
+
+spring.jmx.enabled=false
diff --git a/spring-security-modules/spring-security-saml/README.md b/spring-security-modules/spring-security-saml/README.md
index 271b29632e..b6a11ed91b 100644
--- a/spring-security-modules/spring-security-saml/README.md
+++ b/spring-security-modules/spring-security-saml/README.md
@@ -1,3 +1,4 @@
### Relevant Articles:
- [A Guide to SAML with Spring Security](https://www.baeldung.com/spring-security-saml)
+- [SAML with Spring Boot and Spring Security](https://www.baeldung.com/spring-security-saml)