diff --git a/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/removewhitespace/RemoveWhitespaceUnitTest.java b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/removewhitespace/RemoveWhitespaceUnitTest.java
new file mode 100644
index 0000000000..f749484ba9
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/removewhitespace/RemoveWhitespaceUnitTest.java
@@ -0,0 +1,35 @@
+package com.baeldung.removewhitespace;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class RemoveWhitespaceUnitTest {
+ private final String myString = " I am a wonderful String ! ";
+
+ @Test
+ void givenStringWithWhitespace_whenRemoveAllWhitespace_shouldGetExpectedResult() {
+ String result = myString.replaceAll("\\s", "");
+ assertThat(result).isEqualTo("IamawonderfulString!");
+ }
+
+ @Test
+ void givenStringWithWhitespace_whenRemoveAllWhitespaceUsingStringUtils_shouldGetExpectedResult() {
+ String result = StringUtils.deleteWhitespace(myString);
+ assertThat(result).isEqualTo("IamawonderfulString!");
+ }
+
+ @Test
+ void givenStringWithWhitespace_whenReplaceConsecutiveSpacesWithSingleSpace_shouldGetExpectedResult() {
+ String result = myString.replaceAll("\\s+", " ");
+ assertThat(result).isEqualTo(" I am a wonderful String ! ");
+ assertThat(result.trim()).isEqualTo("I am a wonderful String !");
+ }
+
+ @Test
+ void givenStringWithWhitespace_whenNormalizeWithApacheCommons_shouldGetExpectedResult() {
+ String result = StringUtils.normalizeSpace(myString);
+ assertThat(result).isEqualTo("I am a wonderful String !");
+ }
+}
diff --git a/docker-modules/docker-compose/README.md b/docker-modules/docker-compose/README.md
index fbb58107d3..10554a319d 100644
--- a/docker-modules/docker-compose/README.md
+++ b/docker-modules/docker-compose/README.md
@@ -2,4 +2,6 @@
- [Introduction to Docker Compose](https://www.baeldung.com/ops/docker-compose)
- [How to Get Docker-Compose to Always Use the Latest Image](https://www.baeldung.com/ops/docker-compose-latest-image)
+- [Communication Between Multiple Docker Compose Projects](https://www.baeldung.com/ops/docker-compose-communication)
+- [Difference Between links and depends_on in Docker Compose](https://www.baeldung.com/ops/docker-compose-links-depends-on)
diff --git a/docker-modules/docker-compose/two-compose-share-same-network/create-network-from-service/docker-compose-my-app-service.yaml b/docker-modules/docker-compose/two-compose-share-same-network/create-network-from-service/docker-compose-my-app-service.yaml
new file mode 100644
index 0000000000..42e9eec8a1
--- /dev/null
+++ b/docker-modules/docker-compose/two-compose-share-same-network/create-network-from-service/docker-compose-my-app-service.yaml
@@ -0,0 +1,13 @@
+services:
+ my_app:
+ image: web-app:latest
+ container_name: web-app
+ ports:
+ - "8080:8080"
+ networks:
+ - my-app
+
+networks:
+ my-app:
+ name: redis_network
+ external: true
\ No newline at end of file
diff --git a/docker-modules/docker-compose/two-compose-share-same-network/create-network-from-service/docker-compose-redis-service.yaml b/docker-modules/docker-compose/two-compose-share-same-network/create-network-from-service/docker-compose-redis-service.yaml
new file mode 100644
index 0000000000..ef9573a803
--- /dev/null
+++ b/docker-modules/docker-compose/two-compose-share-same-network/create-network-from-service/docker-compose-redis-service.yaml
@@ -0,0 +1,13 @@
+services:
+ redis:
+ image: redis:latest
+ container_name: redis
+ ports:
+ - '6379:6379'
+ networks:
+ - network
+
+networks:
+ network:
+ driver: bridge
+ name: redis_network
diff --git a/docker-modules/docker-compose/two-compose-share-same-network/join-existing-network/docker-compose-my-app-service.yaml b/docker-modules/docker-compose/two-compose-share-same-network/join-existing-network/docker-compose-my-app-service.yaml
new file mode 100644
index 0000000000..f3310108ce
--- /dev/null
+++ b/docker-modules/docker-compose/two-compose-share-same-network/join-existing-network/docker-compose-my-app-service.yaml
@@ -0,0 +1,12 @@
+services:
+ my_app:
+ image: web-app:latest
+ container_name: web-app
+ ports:
+ - "8080:8080"
+ networks:
+ - network-example
+
+networks:
+ network-example:
+ external: true
\ No newline at end of file
diff --git a/docker-modules/docker-compose/two-compose-share-same-network/join-existing-network/docker-compose-redis-service.yaml b/docker-modules/docker-compose/two-compose-share-same-network/join-existing-network/docker-compose-redis-service.yaml
new file mode 100644
index 0000000000..2cf44a05d6
--- /dev/null
+++ b/docker-modules/docker-compose/two-compose-share-same-network/join-existing-network/docker-compose-redis-service.yaml
@@ -0,0 +1,12 @@
+services:
+ redis:
+ image: redis:latest
+ container_name: redis
+ ports:
+ - '6379:6379'
+ networks:
+ - network-example
+
+networks:
+ network-example:
+ external: true
diff --git a/javaxval/README.md b/javaxval/README.md
index 8fc5b07ccf..346c4268c1 100644
--- a/javaxval/README.md
+++ b/javaxval/README.md
@@ -13,3 +13,4 @@ This module contains articles about Bean Validation.
- [Guide to ParameterMessageInterpolator](https://www.baeldung.com/hibernate-parametermessageinterpolator)
- [Hibernate Validator Annotation Processor in Depth](https://www.baeldung.com/hibernate-validator-annotation-processor)
- [Constraint Composition with Bean Validation](https://www.baeldung.com/java-bean-validation-constraint-composition)
+- [Using @NotNull on a Method Parameter](https://www.baeldung.com/java-notnull-method-parameter)
diff --git a/libraries-security/src/test/resources/logback-test.xml b/libraries-security/src/test/resources/logback-test.xml
index 8d4771e308..fcbdb8b5f7 100644
--- a/libraries-security/src/test/resources/logback-test.xml
+++ b/libraries-security/src/test/resources/logback-test.xml
@@ -6,6 +6,10 @@
+
+
+
+
diff --git a/maven-modules/maven-repositories/maven-download-artifacts/pom.xml b/maven-modules/maven-repositories/maven-download-artifacts/pom.xml
new file mode 100644
index 0000000000..678fc32bec
--- /dev/null
+++ b/maven-modules/maven-repositories/maven-download-artifacts/pom.xml
@@ -0,0 +1,52 @@
+
+
+ 4.0.0
+ maven-repository-download
+ Maven Release Repository
+ 1.0.0-SNAPSHOT
+
+
+ com.baeldung
+ maven-repositories
+ 1.0.0-SNAPSHOT
+
+
+
+
+ nexus-snapshot
+ nexus-snapshot
+ http://localhost:8081/repository/maven-snapshots/
+
+ true
+
+
+ false
+
+
+
+ nexus-release
+ nexus-release
+ http://localhost:8081/repository/maven-releases/
+
+ false
+
+
+
+
+
+
+ com.baeldung
+ maven-release-repository
+ 1.0.0
+
+
+
+ com.baeldung
+ maven-snapshot-repository
+ 1.0.0-SNAPSHOT
+
+
+
+
\ No newline at end of file
diff --git a/maven-modules/maven-repositories/maven-release-repository/pom.xml b/maven-modules/maven-repositories/maven-release-repository/pom.xml
new file mode 100644
index 0000000000..bd7adcbcce
--- /dev/null
+++ b/maven-modules/maven-repositories/maven-release-repository/pom.xml
@@ -0,0 +1,38 @@
+
+
+ 4.0.0
+ maven-release-repository
+ Maven Release Repository
+ 1.0.0
+
+
+ com.baeldung
+ maven-repositories
+ 1.0.0-SNAPSHOT
+
+
+
+
+ nexus
+ nexus-release
+ http://localhost:8081/repository/maven-releases/
+
+ false
+
+
+ true
+
+
+
+
+
+
+ nexus
+ nexus-release
+ http://localhost:8081/repository/maven-releases/
+
+
+
+
\ No newline at end of file
diff --git a/maven-modules/maven-repositories/maven-snapshot-repository/pom.xml b/maven-modules/maven-repositories/maven-snapshot-repository/pom.xml
new file mode 100644
index 0000000000..5409e47b8e
--- /dev/null
+++ b/maven-modules/maven-repositories/maven-snapshot-repository/pom.xml
@@ -0,0 +1,38 @@
+
+
+ 4.0.0
+ maven-snapshot-repository
+ Maven Snapshot Repository
+ 1.0.0-SNAPSHOT
+
+
+ com.baeldung
+ maven-repositories
+ 1.0.0-SNAPSHOT
+
+
+
+
+ nexus
+ nexus-snapshot
+ http://localhost:8081/repository/maven-snapshots/
+
+ true
+
+
+ false
+
+
+
+
+
+
+ nexus
+ nexus-snapshot
+ http://localhost:8081/repository/maven-snapshots/
+
+
+
+
\ No newline at end of file
diff --git a/maven-modules/maven-repositories/pom.xml b/maven-modules/maven-repositories/pom.xml
new file mode 100644
index 0000000000..ba39d00d65
--- /dev/null
+++ b/maven-modules/maven-repositories/pom.xml
@@ -0,0 +1,23 @@
+
+
+ 4.0.0
+ maven-repositories
+ 1.0.0-SNAPSHOT
+ Maven Repositories
+ pom
+
+
+ com.baeldung
+ maven-modules
+ 0.0.1-SNAPSHOT
+
+
+
+ maven-release-repository
+ maven-snapshot-repository
+ maven-download-artifacts
+
+
+
\ No newline at end of file
diff --git a/maven-modules/pom.xml b/maven-modules/pom.xml
index 253f5d9fa0..412e26f041 100644
--- a/maven-modules/pom.xml
+++ b/maven-modules/pom.xml
@@ -41,6 +41,7 @@
maven-parent-pom-resolution
maven-simple
maven-classifier
+ maven-repositories
diff --git a/metrics/src/test/java/com/baeldung/metrics/micrometer/MicrometerAtlasIntegrationTest.java b/metrics/src/test/java/com/baeldung/metrics/micrometer/MicrometerAtlasManualTest.java
similarity index 99%
rename from metrics/src/test/java/com/baeldung/metrics/micrometer/MicrometerAtlasIntegrationTest.java
rename to metrics/src/test/java/com/baeldung/metrics/micrometer/MicrometerAtlasManualTest.java
index 02ef926794..8341befb83 100644
--- a/metrics/src/test/java/com/baeldung/metrics/micrometer/MicrometerAtlasIntegrationTest.java
+++ b/metrics/src/test/java/com/baeldung/metrics/micrometer/MicrometerAtlasManualTest.java
@@ -37,7 +37,7 @@ import com.netflix.spectator.atlas.AtlasConfig;
/**
* @author aiet
*/
-public class MicrometerAtlasIntegrationTest {
+public class MicrometerAtlasManualTest {
private AtlasConfig atlasConfig;
diff --git a/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/detachedentity/HibernateUtil.java b/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/detachedentity/HibernateUtil.java
index 0420755354..a7b1f496d9 100644
--- a/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/detachedentity/HibernateUtil.java
+++ b/persistence-modules/hibernate-exceptions/src/main/java/com/baeldung/hibernate/exception/detachedentity/HibernateUtil.java
@@ -24,7 +24,8 @@ public class HibernateUtil {
settings.put(Environment.USER, "sa");
settings.put(Environment.PASS, "");
settings.put(Environment.DIALECT, "org.hibernate.dialect.HSQLDialect");
- settings.put(Environment.SHOW_SQL, "true");
+ // enable to show Hibernate generated SQL
+ settings.put(Environment.SHOW_SQL, "false");
settings.put(Environment.FORMAT_SQL, "true");
settings.put(Environment.USE_SQL_COMMENTS, "true");
settings.put(Environment.HBM2DDL_AUTO, "update");
diff --git a/testing-modules/mockito-2/src/main/resources/logback.xml b/persistence-modules/hibernate-exceptions/src/test/resources/logback-test.xml
similarity index 59%
rename from testing-modules/mockito-2/src/main/resources/logback.xml
rename to persistence-modules/hibernate-exceptions/src/test/resources/logback-test.xml
index 7d900d8ea8..5d5620b2c1 100644
--- a/testing-modules/mockito-2/src/main/resources/logback.xml
+++ b/persistence-modules/hibernate-exceptions/src/test/resources/logback-test.xml
@@ -2,11 +2,14 @@
- %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
-
+ [%d{ISO8601}]-[%thread] %-5level %logger - %msg%n
+
+
+
+
diff --git a/persistence-modules/java-mongodb-3/README.md b/persistence-modules/java-mongodb-3/README.md
index 3ffe5980da..d76d53b06a 100644
--- a/persistence-modules/java-mongodb-3/README.md
+++ b/persistence-modules/java-mongodb-3/README.md
@@ -1,3 +1,4 @@
### Relevant Artilces:
- [Guide to Find in MongoDB](https://www.baeldung.com/mongodb-find)
+- [Query Documents using Document ID in MongoDB](https://www.baeldung.com/mongodb-query-documents-id)
diff --git a/persistence-modules/spring-boot-persistence-mongodb-2/README.md b/persistence-modules/spring-boot-persistence-mongodb-2/README.md
index f3be63c8b5..6a98f05520 100644
--- a/persistence-modules/spring-boot-persistence-mongodb-2/README.md
+++ b/persistence-modules/spring-boot-persistence-mongodb-2/README.md
@@ -4,4 +4,5 @@
- [Configure MongoDB Collection Name for a Class in Spring Data](https://www.baeldung.com/spring-data-mongodb-collection-name)
- [MongoDB Composite Key With Spring Data](https://www.baeldung.com/spring-data-mongodb-composite-key)
- [Unique Field in MongoDB Document in Spring Data](https://www.baeldung.com/spring-data-mongodb-unique)
+- [Count Documents Using Spring Data MongoDB Repository](https://www.baeldung.com/spring-data-mongodb-count)
- More articles: [[<--prev]](../spring-boot-persistence-mongodb)
diff --git a/persistence-modules/spring-data-rest-2/README.md b/persistence-modules/spring-data-rest-2/README.md
index 04a54291b0..1f0191cac9 100644
--- a/persistence-modules/spring-data-rest-2/README.md
+++ b/persistence-modules/spring-data-rest-2/README.md
@@ -6,6 +6,7 @@ This module contains articles about Spring Data REST
- [Guide to Spring Data REST Validators](https://www.baeldung.com/spring-data-rest-validators)
- [Spring Data Web Support](https://www.baeldung.com/spring-data-web-support)
- [Spring REST and HAL Browser](https://www.baeldung.com/spring-rest-hal)
+- [Spring Data Rest – Serializing the Entity ID](https://www.baeldung.com/spring-data-rest-serialize-entity-id)
### The Course
The "REST With Spring" Classes: http://bit.ly/restwithspring
diff --git a/spring-boot-modules/spring-boot-libraries-2/pom.xml b/spring-boot-modules/spring-boot-libraries-2/pom.xml
index f62a341efc..79c090dde5 100644
--- a/spring-boot-modules/spring-boot-libraries-2/pom.xml
+++ b/spring-boot-modules/spring-boot-libraries-2/pom.xml
@@ -62,6 +62,16 @@
spqr
0.11.2
+
+ org.reflections
+ reflections
+ 0.10.2
+
+
+ org.jboss
+ jandex
+ 2.4.3.Final
+
@@ -92,6 +102,27 @@
+
+ org.jboss.jandex
+ jandex-maven-plugin
+ 1.2.3
+
+
+ compile
+ make-index
+
+ jandex
+
+
+
+
+ ${project.build.outputDirectory}
+
+
+
+
+
+
diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/SampleAnnotatedClass.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/SampleAnnotatedClass.java
new file mode 100644
index 0000000000..64849d6a3a
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/SampleAnnotatedClass.java
@@ -0,0 +1,14 @@
+package com.baeldung.annotation.scanner;
+
+@SampleAnnotation(name = "SampleAnnotatedClass")
+public class SampleAnnotatedClass {
+
+ @SampleAnnotation(name = "annotatedMethod")
+ public void annotatedMethod() {
+ //Do something
+ }
+
+ public void notAnnotatedMethod() {
+ //Do something
+ }
+}
diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/SampleAnnotation.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/SampleAnnotation.java
new file mode 100644
index 0000000000..212e12e910
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/SampleAnnotation.java
@@ -0,0 +1,14 @@
+package com.baeldung.annotation.scanner;
+
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+@Target({ METHOD, TYPE })
+@Retention(RUNTIME)
+public @interface SampleAnnotation {
+ String name();
+}
diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/SampleAnnotationScanner.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/SampleAnnotationScanner.java
new file mode 100644
index 0000000000..5cc9a2e8b3
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/SampleAnnotationScanner.java
@@ -0,0 +1,13 @@
+package com.baeldung.annotation.scanner;
+
+import java.util.List;
+
+public interface SampleAnnotationScanner {
+ List scanAnnotatedMethods();
+
+ List scanAnnotatedClasses();
+
+ boolean supportsMethodScan();
+
+ boolean supportsClassScan();
+}
diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/ScanNotSupportedException.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/ScanNotSupportedException.java
new file mode 100644
index 0000000000..1566dc3fad
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/ScanNotSupportedException.java
@@ -0,0 +1,4 @@
+package com.baeldung.annotation.scanner;
+
+public class ScanNotSupportedException extends RuntimeException{
+}
diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/UnexpectedScanException.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/UnexpectedScanException.java
new file mode 100644
index 0000000000..bd7c129bfd
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/UnexpectedScanException.java
@@ -0,0 +1,7 @@
+package com.baeldung.annotation.scanner;
+
+public class UnexpectedScanException extends RuntimeException {
+ public UnexpectedScanException(Throwable ex) {
+ super(ex);
+ }
+}
diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/jandexlib/JandexScannerService.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/jandexlib/JandexScannerService.java
new file mode 100644
index 0000000000..fc10db223e
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/jandexlib/JandexScannerService.java
@@ -0,0 +1,76 @@
+package com.baeldung.annotation.scanner.jandexlib;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.jboss.jandex.AnnotationInstance;
+import org.jboss.jandex.AnnotationTarget;
+import org.jboss.jandex.DotName;
+import org.jboss.jandex.Index;
+import org.jboss.jandex.IndexReader;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.io.Resource;
+import org.springframework.stereotype.Service;
+
+import com.baeldung.annotation.scanner.SampleAnnotationScanner;
+import com.baeldung.annotation.scanner.UnexpectedScanException;
+
+@Service
+public class JandexScannerService implements SampleAnnotationScanner {
+ @Value("classpath:META-INF/jandex.idx")
+ private Resource appFile;
+
+ @Override
+ public List scanAnnotatedMethods() {
+ try {
+ final IndexReader reader = new IndexReader(appFile.getInputStream());
+ Index jandexFile = reader.read();
+ final List appAnnotationList = jandexFile.getAnnotations(DotName.createSimple("com.baeldung.annotation.scanner.SampleAnnotation"));
+ List annotatedMethods = new ArrayList<>();
+ for (AnnotationInstance annotationInstance : appAnnotationList) {
+ if (annotationInstance.target()
+ .kind() == AnnotationTarget.Kind.METHOD) {
+ annotatedMethods.add(annotationInstance.value("name")
+ .value()
+ .toString());
+ }
+ }
+ return Collections.unmodifiableList(annotatedMethods);
+ } catch (IOException e) {
+ throw new UnexpectedScanException(e);
+ }
+ }
+
+ @Override
+ public List scanAnnotatedClasses() {
+ try {
+ final IndexReader reader = new IndexReader(appFile.getInputStream());
+ Index jandexFile = reader.read();
+ final List appAnnotationList = jandexFile.getAnnotations(DotName.createSimple("com.baeldung.annotation.scanner.SampleAnnotation"));
+ List annotatedClasses = new ArrayList<>();
+ for (AnnotationInstance annotationInstance : appAnnotationList) {
+ if (annotationInstance.target()
+ .kind() == AnnotationTarget.Kind.CLASS) {
+ annotatedClasses.add(annotationInstance.value("name")
+ .value()
+ .toString());
+ }
+ }
+ return Collections.unmodifiableList(annotatedClasses);
+ } catch (IOException e) {
+ throw new UnexpectedScanException(e);
+ }
+ }
+
+ @Override
+ public boolean supportsMethodScan() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsClassScan() {
+ return true;
+ }
+}
diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/javareflectionlib/JavaReflectionsScannerService.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/javareflectionlib/JavaReflectionsScannerService.java
new file mode 100644
index 0000000000..2833bb1326
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/javareflectionlib/JavaReflectionsScannerService.java
@@ -0,0 +1,58 @@
+package com.baeldung.annotation.scanner.javareflectionlib;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+
+import com.baeldung.annotation.scanner.SampleAnnotation;
+import com.baeldung.annotation.scanner.SampleAnnotationScanner;
+import com.baeldung.annotation.scanner.UnexpectedScanException;
+
+@Service
+public class JavaReflectionsScannerService implements SampleAnnotationScanner {
+ @Override
+ public List scanAnnotatedMethods() {
+ try {
+ Class> clazz = ClassLoader.getSystemClassLoader()
+ .loadClass("com.baeldung.annotation.scanner.SampleAnnotatedClass");
+ Method[] methods = clazz.getMethods();
+ List annotatedMethods = new ArrayList<>();
+ for (Method method : methods) {
+ SampleAnnotation annotation = method.getAnnotation(SampleAnnotation.class);
+ if (annotation != null) {
+ annotatedMethods.add(annotation.name());
+ }
+ }
+ return Collections.unmodifiableList(annotatedMethods);
+ } catch (ClassNotFoundException e) {
+ throw new UnexpectedScanException(e);
+ }
+ }
+
+ @Override
+ public List scanAnnotatedClasses() {
+ try {
+ Class> clazz = ClassLoader.getSystemClassLoader()
+ .loadClass("com.baeldung.annotation.scanner.SampleAnnotatedClass");
+ SampleAnnotation classAnnotation = clazz.getAnnotation(SampleAnnotation.class);
+ List annotatedClasses = new ArrayList<>();
+ annotatedClasses.add(classAnnotation.name());
+ return Collections.unmodifiableList(annotatedClasses);
+ } catch (ClassNotFoundException e) {
+ throw new UnexpectedScanException(e);
+ }
+ }
+
+ @Override
+ public boolean supportsMethodScan() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsClassScan() {
+ return true;
+ }
+}
diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/reflectionslib/ReflectionsScannerService.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/reflectionslib/ReflectionsScannerService.java
new file mode 100644
index 0000000000..82a10e21aa
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/reflectionslib/ReflectionsScannerService.java
@@ -0,0 +1,45 @@
+package com.baeldung.annotation.scanner.reflectionslib;
+
+import java.lang.reflect.Method;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.reflections.Reflections;
+import org.springframework.stereotype.Service;
+
+import com.baeldung.annotation.scanner.SampleAnnotation;
+import com.baeldung.annotation.scanner.SampleAnnotationScanner;
+
+@Service
+public class ReflectionsScannerService implements SampleAnnotationScanner {
+ @Override
+ public List scanAnnotatedMethods() {
+ Reflections reflections = new Reflections("com.baeldung.annotation.scanner");
+ Set methods = reflections.getMethodsAnnotatedWith(SampleAnnotation.class);
+ return methods.stream()
+ .map(method -> method.getAnnotation(SampleAnnotation.class)
+ .name())
+ .collect(Collectors.toList());
+ }
+
+ @Override
+ public List scanAnnotatedClasses() {
+ Reflections reflections = new Reflections("com.baeldung.annotation.scanner");
+ Set> types = reflections.getTypesAnnotatedWith(SampleAnnotation.class);
+ return types.stream()
+ .map(clazz -> clazz.getAnnotation(SampleAnnotation.class)
+ .name())
+ .collect(Collectors.toList());
+ }
+
+ @Override
+ public boolean supportsMethodScan() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsClassScan() {
+ return true;
+ }
+}
diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/springcontextlib/SpringBeanAnnotationScannerService.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/springcontextlib/SpringBeanAnnotationScannerService.java
new file mode 100644
index 0000000000..cd31ae686e
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/springcontextlib/SpringBeanAnnotationScannerService.java
@@ -0,0 +1,52 @@
+package com.baeldung.annotation.scanner.springcontextlib;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
+import org.springframework.core.type.filter.AnnotationTypeFilter;
+import org.springframework.stereotype.Service;
+
+import com.baeldung.annotation.scanner.SampleAnnotation;
+import com.baeldung.annotation.scanner.SampleAnnotationScanner;
+import com.baeldung.annotation.scanner.ScanNotSupportedException;
+
+@Service
+public class SpringBeanAnnotationScannerService implements SampleAnnotationScanner {
+ @Override
+ public List scanAnnotatedMethods() {
+ throw new ScanNotSupportedException();
+ }
+
+ @Override
+ public List scanAnnotatedClasses() {
+ ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
+ provider.addIncludeFilter(new AnnotationTypeFilter(SampleAnnotation.class));
+ Set beanDefs = provider.findCandidateComponents("com.baeldung.annotation.scanner");
+ List annotatedBeans = new ArrayList<>();
+ for (BeanDefinition bd : beanDefs) {
+ if (bd instanceof AnnotatedBeanDefinition) {
+ Map annotAttributeMap = ((AnnotatedBeanDefinition) bd).getMetadata()
+ .getAnnotationAttributes(SampleAnnotation.class.getCanonicalName());
+ annotatedBeans.add(annotAttributeMap.get("name")
+ .toString());
+ }
+ }
+ return Collections.unmodifiableList(annotatedBeans);
+ }
+
+ @Override
+ public boolean supportsMethodScan() {
+ return false;
+ }
+
+ @Override
+ public boolean supportsClassScan() {
+ return true;
+ }
+}
diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/springcorelib/SpringCoreAnnotationScannerService.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/springcorelib/SpringCoreAnnotationScannerService.java
new file mode 100644
index 0000000000..f3421fe46d
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/annotation/scanner/springcorelib/SpringCoreAnnotationScannerService.java
@@ -0,0 +1,42 @@
+package com.baeldung.annotation.scanner.springcorelib;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.springframework.core.annotation.AnnotationUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ClassUtils;
+
+import com.baeldung.annotation.scanner.SampleAnnotationScanner;
+import com.baeldung.annotation.scanner.SampleAnnotatedClass;
+import com.baeldung.annotation.scanner.SampleAnnotation;
+import com.baeldung.annotation.scanner.ScanNotSupportedException;
+
+@Service
+public class SpringCoreAnnotationScannerService implements SampleAnnotationScanner {
+ @Override
+ public List scanAnnotatedMethods() {
+ final Class> userClass = ClassUtils.getUserClass(SampleAnnotatedClass.class);
+ return Arrays.stream(userClass.getMethods())
+ .filter(method -> AnnotationUtils.getAnnotation(method, SampleAnnotation.class) != null)
+ .map(method -> method.getAnnotation(SampleAnnotation.class)
+ .name())
+ .collect(Collectors.toList());
+ }
+
+ @Override
+ public List scanAnnotatedClasses() {
+ throw new ScanNotSupportedException();
+ }
+
+ @Override
+ public boolean supportsMethodScan() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsClassScan() {
+ return false;
+ }
+}
diff --git a/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/annotation/scanner/SampleAnnotationScannerUnitTest.java b/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/annotation/scanner/SampleAnnotationScannerUnitTest.java
new file mode 100644
index 0000000000..80eca2b4c5
--- /dev/null
+++ b/spring-boot-modules/spring-boot-libraries-2/src/test/java/com/baeldung/annotation/scanner/SampleAnnotationScannerUnitTest.java
@@ -0,0 +1,47 @@
+package com.baeldung.annotation.scanner;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.junit.Assert.*;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class SampleAnnotationScannerUnitTest {
+ @Autowired
+ private List scannerList;
+
+ @Test
+ public void givenPackage_whenScanAnnotatedClasses_thenAnnotationValues() {
+ final List annotatedClasses = scannerList.stream()
+ .filter(SampleAnnotationScanner::supportsClassScan)
+ .map(SampleAnnotationScanner::scanAnnotatedClasses)
+ .flatMap(Collection::stream)
+ .collect(Collectors.toList());
+
+ assertNotNull(annotatedClasses);
+ assertEquals(4, annotatedClasses.size());
+ annotatedClasses.forEach(annotValue -> assertEquals("SampleAnnotatedClass", annotValue));
+ }
+
+ @Test
+ public void givenPackage_whenScanAnnotatedMethods_thenAnnotationValues() {
+ final List annotatedMethods = scannerList.stream()
+ .filter(SampleAnnotationScanner::supportsMethodScan)
+ .map(SampleAnnotationScanner::scanAnnotatedMethods)
+ .flatMap(Collection::stream)
+ .collect(Collectors.toList());
+
+ assertNotNull(annotatedMethods);
+ assertEquals(3, annotatedMethods.size());
+ annotatedMethods.forEach(annotValue -> assertEquals("annotatedMethod", annotValue));
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/DefaultGlobalSecuritySchemeApplication.java b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/DefaultGlobalSecuritySchemeApplication.java
new file mode 100644
index 0000000000..1ce81a1e83
--- /dev/null
+++ b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/DefaultGlobalSecuritySchemeApplication.java
@@ -0,0 +1,32 @@
+package com.baeldung.defaultglobalsecurityscheme;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.web.SecurityFilterChain;
+
+import io.swagger.v3.oas.annotations.OpenAPIDefinition;
+import io.swagger.v3.oas.annotations.enums.SecuritySchemeIn;
+import io.swagger.v3.oas.annotations.enums.SecuritySchemeType;
+import io.swagger.v3.oas.annotations.info.Info;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
+import io.swagger.v3.oas.annotations.security.SecurityScheme;
+
+@SpringBootApplication
+@OpenAPIDefinition(info = @Info(title = "Apply Default Global SecurityScheme in springdoc-openapi", version = "1.0.0"), security = { @SecurityRequirement(name = "api_key") })
+@SecurityScheme(type = SecuritySchemeType.APIKEY, name = "api_key", in = SecuritySchemeIn.HEADER)
+public class DefaultGlobalSecuritySchemeApplication {
+ @Bean
+ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
+ return http.authorizeHttpRequests(authorizeRequests -> authorizeRequests.antMatchers("/api/auth/**", "/swagger-ui-custom.html", "/swagger-ui.html", "/swagger-ui/**", "/v3/api-docs/**", "/webjars/**", "/swagger-ui/index.html", "/api-docs/**")
+ .permitAll()
+ .anyRequest()
+ .authenticated())
+ .build();
+ }
+
+ public static void main(String[] args) {
+ SpringApplication.run(DefaultGlobalSecuritySchemeApplication.class, args);
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/controller/DefaultGlobalSecuritySchemeOpenApiController.java b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/controller/DefaultGlobalSecuritySchemeOpenApiController.java
new file mode 100644
index 0000000000..4ad7a2a2c3
--- /dev/null
+++ b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/controller/DefaultGlobalSecuritySchemeOpenApiController.java
@@ -0,0 +1,61 @@
+package com.baeldung.defaultglobalsecurityscheme.controller;
+
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
+
+import javax.validation.Valid;
+
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.baeldung.defaultglobalsecurityscheme.dto.LoginDto;
+import com.baeldung.defaultglobalsecurityscheme.dto.ApplicationExceptionDto;
+import com.baeldung.defaultglobalsecurityscheme.dto.PingResponseDto;
+import com.baeldung.defaultglobalsecurityscheme.dto.TokenDto;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.ExampleObject;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.security.SecurityRequirements;
+
+@RestController
+@RequestMapping("/")
+public class DefaultGlobalSecuritySchemeOpenApiController {
+ @RequestMapping(method = RequestMethod.POST, value = "/login", produces = { "application/json" }, consumes = { "application/json" })
+ @Operation(operationId = "login", responses = {
+ @ApiResponse(responseCode = "200", description = "api_key to be used in the secured-ping entry point", content = { @Content(mediaType = "application/json", schema = @Schema(implementation = TokenDto.class)) }),
+ @ApiResponse(responseCode = "401", description = "Unauthorized request", content = { @Content(mediaType = "application/json", schema = @Schema(implementation = ApplicationExceptionDto.class)) }) })
+ @SecurityRequirements()
+ public ResponseEntity login(@Parameter(name = "LoginDto", description = "Login") @Valid @RequestBody(required = true) LoginDto loginDto) {
+ TokenDto token = new TokenDto();
+ token.setRaw("Generated Token");
+ return ResponseEntity.ok(token);
+ }
+
+ @Operation(operationId = "ping", responses = {
+ @ApiResponse(responseCode = "200", description = "Ping that needs an api_key attribute in the header", content = {
+ @Content(mediaType = "application/json", schema = @Schema(implementation = PingResponseDto.class), examples = { @ExampleObject(value = "{ pong: '2022-06-17T18:30:33.465+02:00' }") }) }),
+ @ApiResponse(responseCode = "401", description = "Unauthorized request", content = { @Content(mediaType = "application/json", schema = @Schema(implementation = ApplicationExceptionDto.class)) }),
+ @ApiResponse(responseCode = "403", description = "Forbidden request", content = { @Content(mediaType = "application/json", schema = @Schema(implementation = ApplicationExceptionDto.class)) }) })
+ @RequestMapping(method = RequestMethod.GET, value = "/ping", produces = { "application/json" })
+ public ResponseEntity ping(@RequestHeader(name = "api_key", required = false) String api_key) {
+ int year = 2000;
+ int month = 1;
+ int dayOfMonth = 1;
+ int hour = 0;
+ int minute = 0;
+ int second = 0;
+ int nanoSeccond = 0;
+ ZoneOffset offset = ZoneOffset.UTC;
+ PingResponseDto response = new PingResponseDto();
+ response.setPong(OffsetDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoSeccond, offset));
+ return ResponseEntity.ok(response);
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/dto/ApplicationExceptionDto.java b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/dto/ApplicationExceptionDto.java
new file mode 100644
index 0000000000..5fb63793c4
--- /dev/null
+++ b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/dto/ApplicationExceptionDto.java
@@ -0,0 +1,26 @@
+package com.baeldung.defaultglobalsecurityscheme.dto;
+
+public class ApplicationExceptionDto {
+ private long errorCode;
+ private String description;
+
+ public ApplicationExceptionDto() {
+ super();
+ }
+
+ public long getErrorCode() {
+ return errorCode;
+ }
+
+ public void setErrorCode(long errorCode) {
+ this.errorCode = errorCode;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+}
diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/dto/LoginDto.java b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/dto/LoginDto.java
new file mode 100644
index 0000000000..cf88cc4d98
--- /dev/null
+++ b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/dto/LoginDto.java
@@ -0,0 +1,103 @@
+package com.baeldung.defaultglobalsecurityscheme.dto;
+
+import java.util.Objects;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+/**
+ * LoginDto
+ */
+
+@JsonTypeName("Login")
+public class LoginDto {
+
+ @JsonProperty("user")
+ private String user;
+
+ @JsonProperty("pass")
+ private String pass;
+
+ public LoginDto user(String user) {
+ this.user = user;
+ return this;
+ }
+
+ /**
+ * Get user
+ * @return user
+ */
+
+ @Schema(name = "user", required = true)
+ public String getUser() {
+ return user;
+ }
+
+ public void setUser(String user) {
+ this.user = user;
+ }
+
+ public LoginDto pass(String pass) {
+ this.pass = pass;
+ return this;
+ }
+
+ /**
+ * Get pass
+ * @return pass
+ */
+
+ @Schema(name = "pass", required = true)
+ public String getPass() {
+ return pass;
+ }
+
+ public void setPass(String pass) {
+ this.pass = pass;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ LoginDto login = (LoginDto) o;
+ return Objects.equals(this.user, login.user) && Objects.equals(this.pass, login.pass);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(user, pass);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class LoginDto {\n");
+ sb.append(" user: ")
+ .append(toIndentedString(user))
+ .append("\n");
+ sb.append(" pass: ")
+ .append(toIndentedString(pass))
+ .append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString()
+ .replace("\n", "\n ");
+ }
+}
diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/dto/PingResponseDto.java b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/dto/PingResponseDto.java
new file mode 100644
index 0000000000..0d367785d8
--- /dev/null
+++ b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/dto/PingResponseDto.java
@@ -0,0 +1,84 @@
+package com.baeldung.defaultglobalsecurityscheme.dto;
+
+import java.time.OffsetDateTime;
+import java.util.Objects;
+
+import javax.validation.Valid;
+
+import org.springframework.format.annotation.DateTimeFormat;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+/**
+ * SecuredPingResponseDto
+ */
+
+@JsonTypeName("PingResponse")
+public class PingResponseDto {
+
+ @JsonProperty("pong")
+ @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
+ private OffsetDateTime pong;
+
+ public PingResponseDto pong(OffsetDateTime pong) {
+ this.pong = pong;
+ return this;
+ }
+
+ /**
+ * Get pong
+ * @return pong
+ */
+ @Valid
+ @Schema(name = "pong", required = false)
+ public OffsetDateTime getPong() {
+ return pong;
+ }
+
+ public void setPong(OffsetDateTime pong) {
+ this.pong = pong;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ PingResponseDto securedPingResponse = (PingResponseDto) o;
+ return Objects.equals(this.pong, securedPingResponse.pong);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(pong);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class PingResponseDto {\n");
+ sb.append(" pong: ")
+ .append(toIndentedString(pong))
+ .append("\n");
+ sb.append("}");
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces
+ * (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString()
+ .replace("\n", "\n ");
+ }
+}
diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/dto/TokenDto.java b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/dto/TokenDto.java
new file mode 100644
index 0000000000..d8f7daa09c
--- /dev/null
+++ b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/defaultglobalsecurityscheme/dto/TokenDto.java
@@ -0,0 +1,57 @@
+package com.baeldung.defaultglobalsecurityscheme.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+/**
+ * LoginDto
+ */
+
+@JsonTypeName("Token")
+public class TokenDto {
+
+ @JsonProperty("raw")
+ private String raw;
+
+ @Schema(name = "raw", example = "app token")
+ public String getRaw() {
+ return raw;
+ }
+
+ public void setRaw(String raw) {
+ this.raw = raw;
+ }
+
+ @Override
+ public String toString() {
+ return "TokenDto [raw=" + raw + "]";
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((raw == null) ? 0 : raw.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ TokenDto other = (TokenDto) obj;
+ if (raw == null) {
+ if (other.raw != null)
+ return false;
+ } else if (!raw.equals(other.raw))
+ return false;
+ return true;
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-testing-2/README.md b/spring-boot-modules/spring-boot-testing-2/README.md
index a32469fb2f..bb504aeee0 100644
--- a/spring-boot-modules/spring-boot-testing-2/README.md
+++ b/spring-boot-modules/spring-boot-testing-2/README.md
@@ -11,4 +11,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Setting the Log Level in Spring Boot when Testing](https://www.baeldung.com/spring-boot-testing-log-level)
- [Failed to Load ApplicationContext for JUnit Test of Spring Controller](https://www.baeldung.com/spring-junit-failed-to-load-applicationcontext)
- [Spring Web Service Integration Tests with @WebServiceServerTest](https://www.baeldung.com/spring-webserviceservertest)
+- [Spring Boot – Testing Redis With Testcontainers](https://www.baeldung.com/spring-boot-redis-testcontainers)
+- [Spring Boot – Keycloak Integration Testing with Testcontainers](https://www.baeldung.com/spring-boot-keycloak-integration-testing)
- More articles: [[<-- prev]](../spring-boot-testing)
diff --git a/testing-modules/mockito-2/.gitignore b/testing-modules/mockito-2/.gitignore
deleted file mode 100644
index 7f300600e6..0000000000
--- a/testing-modules/mockito-2/.gitignore
+++ /dev/null
@@ -1,14 +0,0 @@
-*.class
-
-.settings
-.project
-
-#folders#
-/target
-/src/main/webapp/WEB-INF/classes
-*/META-INF/*
-
-# Packaged files #
-*.jar
-*.war
-*.ear
diff --git a/testing-modules/mockito-2/README.md b/testing-modules/mockito-2/README.md
deleted file mode 100644
index 6fd71bf305..0000000000
--- a/testing-modules/mockito-2/README.md
+++ /dev/null
@@ -1,10 +0,0 @@
-### Relevant articles
-
-- [Mockito’s Java 8 Features](https://www.baeldung.com/mockito-2-java-8)
-- [Lazy Verification with Mockito 2](https://www.baeldung.com/mockito-2-lazy-verification)
-- [Mockito Strict Stubbing and The UnnecessaryStubbingException](https://www.baeldung.com/mockito-unnecessary-stubbing-exception)
-- [Mockito and Fluent APIs](https://www.baeldung.com/mockito-fluent-apis)
-- [Mocking the ObjectMapper readValue() Method](https://www.baeldung.com/mockito-mock-jackson-read-value)
-- [Introduction to Mockito’s AdditionalAnswers](https://www.baeldung.com/mockito-additionalanswers)
-- [Difference Between when() and doXxx() Methods in Mockito](https://www.baeldung.com/java-mockito-when-vs-do)
-- [Overview of Mockito MockSettings](https://www.baeldung.com/mockito-mocksettings)
diff --git a/testing-modules/mockito-2/pom.xml b/testing-modules/mockito-2/pom.xml
deleted file mode 100644
index e5812222eb..0000000000
--- a/testing-modules/mockito-2/pom.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
- 4.0.0
- mockito-2
- 0.0.1-SNAPSHOT
- mockito-2
- jar
-
-
- com.baeldung
- testing-modules
- 1.0.0-SNAPSHOT
-
-
-
-
- com.fasterxml.jackson.core
- jackson-databind
- ${jackson.version}
-
-
- org.mockito
- mockito-junit-jupiter
- ${mockito.version}
- test
-
-
-
-
\ No newline at end of file
diff --git a/testing-modules/mockito/.gitignore b/testing-modules/mockito/.gitignore
index 83c05e60c8..7f300600e6 100644
--- a/testing-modules/mockito/.gitignore
+++ b/testing-modules/mockito/.gitignore
@@ -1,13 +1,14 @@
*.class
+.settings
+.project
+
#folders#
/target
-/neoDb*
-/data
/src/main/webapp/WEB-INF/classes
*/META-INF/*
# Packaged files #
*.jar
*.war
-*.ear
\ No newline at end of file
+*.ear
diff --git a/testing-modules/mockito/README.md b/testing-modules/mockito/README.md
index 6cc6bb8955..2870d1afcf 100644
--- a/testing-modules/mockito/README.md
+++ b/testing-modules/mockito/README.md
@@ -1,8 +1,12 @@
-=========
+### Relevant articles
-## Mockito Cookbooks and Examples
-
-
-### Relevant Articles:
+- [Mockito’s Java 8 Features](https://www.baeldung.com/mockito-2-java-8)
+- [Lazy Verification with Mockito 2](https://www.baeldung.com/mockito-2-lazy-verification)
+- [Mockito Strict Stubbing and The UnnecessaryStubbingException](https://www.baeldung.com/mockito-unnecessary-stubbing-exception)
+- [Mockito and Fluent APIs](https://www.baeldung.com/mockito-fluent-apis)
+- [Mocking the ObjectMapper readValue() Method](https://www.baeldung.com/mockito-mock-jackson-read-value)
+- [Introduction to Mockito’s AdditionalAnswers](https://www.baeldung.com/mockito-additionalanswers)
+- [Difference Between when() and doXxx() Methods in Mockito](https://www.baeldung.com/java-mockito-when-vs-do)
+- [Overview of Mockito MockSettings](https://www.baeldung.com/mockito-mocksettings)
- [Testing Callbacks with Mockito](https://www.baeldung.com/mockito-callbacks)
- [Quick Guide to BDDMockito](https://www.baeldung.com/bdd-mockito)
diff --git a/testing-modules/mockito/pom.xml b/testing-modules/mockito/pom.xml
index 36f4a56dff..b55245f20c 100644
--- a/testing-modules/mockito/pom.xml
+++ b/testing-modules/mockito/pom.xml
@@ -4,75 +4,28 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
mockito
- 0.1-SNAPSHOT
+ 0.0.1-SNAPSHOT
mockito
+ jar
com.baeldung
- parent-java
- 0.0.1-SNAPSHOT
- ../../parent-java
+ testing-modules
+ 1.0.0-SNAPSHOT
- org.springframework
- spring-core
- ${spring-framework.version}
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson.version}
- org.springframework
- spring-context
- ${spring-framework.version}
-
-
- org.springframework.data
- spring-data-jpa
- ${spring-data.version}
-
-
- org.eclipse.persistence
- javax.persistence
- ${javax.persistence.version}
-
-
-
- org.apache.commons
- commons-lang3
- ${commons-lang3.version}
-
-
-
- org.springframework.boot
- spring-boot-starter
- ${spring-boot.version}
- test
-
-
- org.springframework.boot
- spring-boot-starter-test
- ${spring-boot.version}
+ org.mockito
+ mockito-junit-jupiter
+ ${mockito.version}
test
-
- mockito
-
-
- src/main/resources
- true
-
-
-
-
-
- 2.0.4.RELEASE
- 5.0.8.RELEASE
- 2.0.9.RELEASE
-
- 2.0.2
- 2.1.1
-
-
\ No newline at end of file
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/Book.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/additionalanswers/Book.java
similarity index 100%
rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/Book.java
rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/additionalanswers/Book.java
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookRepository.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/additionalanswers/BookRepository.java
similarity index 100%
rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookRepository.java
rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/additionalanswers/BookRepository.java
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookService.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/additionalanswers/BookService.java
similarity index 100%
rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/additionalanswers/BookService.java
rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/additionalanswers/BookService.java
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/fluentapi/Pizza.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/fluentapi/Pizza.java
similarity index 100%
rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/fluentapi/Pizza.java
rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/fluentapi/Pizza.java
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/fluentapi/PizzaService.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/fluentapi/PizzaService.java
similarity index 100%
rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/fluentapi/PizzaService.java
rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/fluentapi/PizzaService.java
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/JobPosition.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/java8/JobPosition.java
similarity index 100%
rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/JobPosition.java
rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/java8/JobPosition.java
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/JobService.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/java8/JobService.java
similarity index 100%
rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/JobService.java
rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/java8/JobService.java
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/Person.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/java8/Person.java
similarity index 100%
rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/Person.java
rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/java8/Person.java
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentService.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/java8/UnemploymentService.java
similarity index 100%
rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentService.java
rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/java8/UnemploymentService.java
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentServiceImpl.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/java8/UnemploymentServiceImpl.java
similarity index 100%
rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentServiceImpl.java
rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/java8/UnemploymentServiceImpl.java
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/mocksettings/AbstractCoffee.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/mocksettings/AbstractCoffee.java
similarity index 100%
rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/mocksettings/AbstractCoffee.java
rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/mocksettings/AbstractCoffee.java
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/mocksettings/SimpleService.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/mocksettings/SimpleService.java
similarity index 100%
rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/mocksettings/SimpleService.java
rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/mocksettings/SimpleService.java
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/mocksettings/SpecialInterface.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/mocksettings/SpecialInterface.java
similarity index 100%
rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/mocksettings/SpecialInterface.java
rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/mocksettings/SpecialInterface.java
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/objectmapper/Flower.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/objectmapper/Flower.java
similarity index 100%
rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/objectmapper/Flower.java
rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/objectmapper/Flower.java
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidator.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidator.java
similarity index 100%
rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidator.java
rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidator.java
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/whenvsdomethods/Employee.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/whenvsdomethods/Employee.java
similarity index 100%
rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/whenvsdomethods/Employee.java
rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/whenvsdomethods/Employee.java
diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/whenvsdomethods/IAmOnHolidayException.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/whenvsdomethods/IAmOnHolidayException.java
similarity index 100%
rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/whenvsdomethods/IAmOnHolidayException.java
rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/whenvsdomethods/IAmOnHolidayException.java
diff --git a/testing-modules/mockito/src/main/resources/logback.xml b/testing-modules/mockito/src/main/resources/logback.xml
index ec0dc2469a..7d900d8ea8 100644
--- a/testing-modules/mockito/src/main/resources/logback.xml
+++ b/testing-modules/mockito/src/main/resources/logback.xml
@@ -2,17 +2,11 @@
- web - %date [%thread] %-5level %logger{36} - %message%n
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
-
-
-
-
-
-
diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/additionalanswers/BookServiceUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/additionalanswers/BookServiceUnitTest.java
similarity index 100%
rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/additionalanswers/BookServiceUnitTest.java
rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/additionalanswers/BookServiceUnitTest.java
diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/BDDMockitoUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/bddmockito/BDDMockitoUnitTest.java
similarity index 100%
rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/BDDMockitoUnitTest.java
rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/bddmockito/BDDMockitoUnitTest.java
diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookRepository.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookRepository.java
similarity index 100%
rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookRepository.java
rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookRepository.java
diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookService.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookService.java
similarity index 100%
rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookService.java
rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookService.java
diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/fluentapi/PizzaServiceUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/fluentapi/PizzaServiceUnitTest.java
similarity index 100%
rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/fluentapi/PizzaServiceUnitTest.java
rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/fluentapi/PizzaServiceUnitTest.java
diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/fluentapi/PizzaUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/fluentapi/PizzaUnitTest.java
similarity index 100%
rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/fluentapi/PizzaUnitTest.java
rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/fluentapi/PizzaUnitTest.java
diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithLambdaUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithLambdaUnitTest.java
similarity index 100%
rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithLambdaUnitTest.java
rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithLambdaUnitTest.java
diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithoutLambdaUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithoutLambdaUnitTest.java
similarity index 100%
rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithoutLambdaUnitTest.java
rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithoutLambdaUnitTest.java
diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithLambdaUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithLambdaUnitTest.java
similarity index 100%
rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithLambdaUnitTest.java
rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithLambdaUnitTest.java
diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithoutLambdaUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithoutLambdaUnitTest.java
similarity index 100%
rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithoutLambdaUnitTest.java
rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithoutLambdaUnitTest.java
diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/JobServiceUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/java8/JobServiceUnitTest.java
similarity index 100%
rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/JobServiceUnitTest.java
rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/java8/JobServiceUnitTest.java
diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/UnemploymentServiceImplUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/java8/UnemploymentServiceImplUnitTest.java
similarity index 100%
rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/UnemploymentServiceImplUnitTest.java
rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/java8/UnemploymentServiceImplUnitTest.java
diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/lazyverification/LazyVerificationUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/lazyverification/LazyVerificationUnitTest.java
similarity index 100%
rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/lazyverification/LazyVerificationUnitTest.java
rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/lazyverification/LazyVerificationUnitTest.java
diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/misusing/ExpectedTestFailureRule.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/misusing/ExpectedTestFailureRule.java
similarity index 100%
rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/misusing/ExpectedTestFailureRule.java
rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/misusing/ExpectedTestFailureRule.java
diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/misusing/MockitoUnecessaryStubUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/misusing/MockitoUnecessaryStubUnitTest.java
similarity index 100%
rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/misusing/MockitoUnecessaryStubUnitTest.java
rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/misusing/MockitoUnecessaryStubUnitTest.java
diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/mocksettings/MockSettingsUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/mocksettings/MockSettingsUnitTest.java
similarity index 100%
rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/mocksettings/MockSettingsUnitTest.java
rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/mocksettings/MockSettingsUnitTest.java
diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidatorUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidatorUnitTest.java
similarity index 100%
rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidatorUnitTest.java
rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/objectmapper/FlowerJsonStringValidatorUnitTest.java
diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/whenvsdomethods/WhenVsDoMethodsUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/whenvsdomethods/WhenVsDoMethodsUnitTest.java
similarity index 100%
rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/whenvsdomethods/WhenVsDoMethodsUnitTest.java
rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/whenvsdomethods/WhenVsDoMethodsUnitTest.java
diff --git a/testing-modules/pom.xml b/testing-modules/pom.xml
index f931cf6947..1601bfb804 100644
--- a/testing-modules/pom.xml
+++ b/testing-modules/pom.xml
@@ -29,7 +29,6 @@
junit5-annotations
junit5-migration
load-testing-comparison
- mockito-2
mockito
mockito-simple
mocks
diff --git a/xml-2/README.md b/xml-2/README.md
index bc599f8480..cfbd9d9911 100644
--- a/xml-2/README.md
+++ b/xml-2/README.md
@@ -5,3 +5,4 @@ This module contains articles about eXtensible Markup Language (XML)
### Relevant Articles:
- [Pretty-Print XML in Java](https://www.baeldung.com/java-pretty-print-xml)
+- [Validate an XML File against an XSD File](https://www.baeldung.com/java-validate-xml-xsd)