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 handlePriceNotFoundException(PriceNotFoundException exception) { diff --git a/spring-core-2/README.md b/spring-core-2/README.md index 735fd8aed5..18e4e32d1f 100644 --- a/spring-core-2/README.md +++ b/spring-core-2/README.md @@ -4,8 +4,6 @@ This module contains articles about core Spring functionality ## Relevant Articles: -- [Spring Profiles](http://www.baeldung.com/spring-profiles) - [Quick Guide to Spring Bean Scopes](http://www.baeldung.com/spring-bean-scopes) - [Spring Events](https://www.baeldung.com/spring-events) -- [Spring Null-Safety Annotations](https://www.baeldung.com/spring-null-safety-annotations) - More articles: [[<-- prev]](/spring-core)[[next -->]](/spring-core-3) diff --git a/spring-core-2/pom.xml b/spring-core-2/pom.xml index 3cd9adf451..d05090fa6b 100644 --- a/spring-core-2/pom.xml +++ b/spring-core-2/pom.xml @@ -162,24 +162,6 @@ - - - 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)