+
+
diff --git a/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperUnitTest.java b/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperUnitTest.java
index 69da2591dd..e9b495279a 100644
--- a/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperUnitTest.java
+++ b/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperUnitTest.java
@@ -6,12 +6,13 @@ import org.junit.Test;
public class ProductHelperUnitTest {
- ProductHelper productHelper = new ProductHelper();
-
@Test
- public void whenInvokedGetDiscount_thenGetItFromCache() {
+ public void whenInvokedGetDiscountTwice_thenGetItFromCache() {
+ ProductHelper productHelper = new ProductHelper();
+ assertTrue(productHelper.getCacheMissCount() == 0);
assertTrue(productHelper.getDiscount("Sports") == 20);
- assertTrue(productHelper.getDiscount("Electronics") == 0);
+ assertTrue(productHelper.getDiscount("Sports") == 20);
+ assertTrue(productHelper.getCacheMissCount() == 1);
}
}
diff --git a/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperUsingLoaderUnitTest.java b/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperUsingLoaderUnitTest.java
index 2656e75cab..3ad77aa2de 100644
--- a/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperUsingLoaderUnitTest.java
+++ b/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperUsingLoaderUnitTest.java
@@ -6,12 +6,16 @@ import org.junit.Test;
public class ProductHelperUsingLoaderUnitTest {
- ProductHelperUsingLoader productHelper = new ProductHelperUsingLoader();
-
@Test
- public void whenInvokedGetDiscount_thenPopulateCache() {
+ public void whenInvokedGetDiscount_thenPopulateCacheUsingLoader() {
+ ProductHelperUsingLoader productHelper = new ProductHelperUsingLoader();
+ assertTrue(productHelper.getCacheMissCount() == 0);
+
assertTrue(productHelper.getDiscount("Sports") == 20);
+ assertTrue(productHelper.getCacheMissCount() == 1);
+
assertTrue(productHelper.getDiscount("Electronics") == 10);
+ assertTrue(productHelper.getCacheMissCount() == 2);
}
}
diff --git a/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperWithEventListenerUnitTest.java b/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperWithEventListenerUnitTest.java
index 7bf08232f4..9aeb9f0552 100644
--- a/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperWithEventListenerUnitTest.java
+++ b/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperWithEventListenerUnitTest.java
@@ -6,10 +6,9 @@ import org.junit.Test;
public class ProductHelperWithEventListenerUnitTest {
- ProductHelperWithEventListener productHelper = new ProductHelperWithEventListener();
-
@Test
public void whenEntryAddedInCache_thenEventListenerCalled() {
+ ProductHelperWithEventListener productHelper = new ProductHelperWithEventListener();
assertTrue(productHelper.getDiscount("Sports") == 20);
}
diff --git a/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperWithExpiryUnitTest.java b/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperWithExpiryUnitTest.java
index 65feba2c70..a3303ca0aa 100644
--- a/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperWithExpiryUnitTest.java
+++ b/libraries-3/src/test/java/com/baeldung/cache2k/ProductHelperWithExpiryUnitTest.java
@@ -6,13 +6,17 @@ import org.junit.Test;
public class ProductHelperWithExpiryUnitTest {
- ProductHelperWithExpiry productHelper = new ProductHelperWithExpiry();
-
@Test
- public void whenInvokedGetDiscountForExpiredProduct_thenNoDiscount() throws InterruptedException {
+ public void whenInvokedGetDiscountAfterExpiration_thenDiscountCalculatedAgain() throws InterruptedException {
+ ProductHelperWithExpiry productHelper = new ProductHelperWithExpiry();
+ assertTrue(productHelper.getCacheMissCount() == 0);
assertTrue(productHelper.getDiscount("Sports") == 20);
+ assertTrue(productHelper.getCacheMissCount() == 1);
+
Thread.sleep(20);
- assertTrue(productHelper.getDiscount("Sports") == 0);
+
+ assertTrue(productHelper.getDiscount("Sports") == 20);
+ assertTrue(productHelper.getCacheMissCount() == 2);
}
}
diff --git a/libraries-3/src/test/java/com/baeldung/moshi/AlternativeAdapterUnitTest.java b/libraries-3/src/test/java/com/baeldung/moshi/AlternativeAdapterUnitTest.java
new file mode 100644
index 0000000000..63d80bfe58
--- /dev/null
+++ b/libraries-3/src/test/java/com/baeldung/moshi/AlternativeAdapterUnitTest.java
@@ -0,0 +1,105 @@
+package com.baeldung.moshi;
+
+import java.io.IOException;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.time.Instant;
+
+import com.squareup.moshi.FromJson;
+import com.squareup.moshi.JsonAdapter;
+import com.squareup.moshi.JsonQualifier;
+import com.squareup.moshi.Moshi;
+import com.squareup.moshi.ToJson;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.junit.Test;
+
+public class AlternativeAdapterUnitTest {
+ @Test
+ public void whenSerializing_thenAlternativeAdapterUsed() {
+ Moshi moshi = new Moshi.Builder()
+ .add(new EpochMillisAdapter())
+ .build();
+ JsonAdapter jsonAdapter = moshi.adapter(Post.class);
+
+ String json = jsonAdapter.toJson(new Post("Introduction to Moshi Json", "Baeldung", Instant.now()));
+ System.out.println(json);
+ }
+
+ @Test
+ public void whenDeserializing_thenAlternativeAdapterUsed() throws IOException {
+ Moshi moshi = new Moshi.Builder()
+ .add(new EpochMillisAdapter())
+ .build();
+ JsonAdapter jsonAdapter = moshi.adapter(Post.class);
+
+ String json = "{\"author\":\"Baeldung\",\"posted\":1582095269204,\"title\":\"Introduction to Moshi Json\"}";
+ Post post = jsonAdapter.fromJson(json);
+ System.out.println(post);
+
+ }
+
+ public static class Post {
+ String title;
+ String author;
+ @EpochMillis Instant posted;
+
+ public Post() {
+ }
+
+ public Post(String title, String author, Instant posted) {
+ this.title = title;
+ this.author = author;
+ this.posted = posted;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+ public Instant getPosted() {
+ return posted;
+ }
+
+ public void setPosted(Instant posted) {
+ this.posted = posted;
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this).append("title", title).append("author", author).append("posted", posted)
+ .toString();
+ }
+ }
+ @Retention(RetentionPolicy.RUNTIME)
+ @Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})
+ @JsonQualifier
+ public @interface EpochMillis {
+ }
+
+ public static class EpochMillisAdapter {
+ @ToJson
+ public Long toJson(@EpochMillis Instant input) {
+ return input.toEpochMilli();
+ }
+ @FromJson
+ @EpochMillis
+ public Instant fromJson(Long input) {
+ return Instant.ofEpochMilli(input);
+ }
+
+ }
+}
diff --git a/libraries-3/src/test/java/com/baeldung/moshi/ArrayUnitTest.java b/libraries-3/src/test/java/com/baeldung/moshi/ArrayUnitTest.java
new file mode 100644
index 0000000000..83bb2bb128
--- /dev/null
+++ b/libraries-3/src/test/java/com/baeldung/moshi/ArrayUnitTest.java
@@ -0,0 +1,36 @@
+package com.baeldung.moshi;
+
+import java.io.IOException;
+import java.lang.reflect.Type;
+import java.util.Arrays;
+import java.util.List;
+
+import com.squareup.moshi.JsonAdapter;
+import com.squareup.moshi.Moshi;
+import com.squareup.moshi.Types;
+import org.junit.Test;
+
+public class ArrayUnitTest {
+ @Test
+ public void whenSerializingList_thenJsonArrayProduced() {
+ Moshi moshi = new Moshi.Builder()
+ .build();
+ Type type = Types.newParameterizedType(List.class, String.class);
+ JsonAdapter> jsonAdapter = moshi.adapter(type);
+
+ String json = jsonAdapter.toJson(Arrays.asList("One", "Two", "Three"));
+ System.out.println(json);
+ }
+
+ @Test
+ public void whenDeserializingJsonArray_thenListProduced() throws IOException {
+ Moshi moshi = new Moshi.Builder()
+ .build();
+ Type type = Types.newParameterizedType(List.class, String.class);
+ JsonAdapter> jsonAdapter = moshi.adapter(type);
+
+ String json = "[\"One\",\"Two\",\"Three\"]";
+ List result = jsonAdapter.fromJson(json);
+ System.out.println(result);
+ }
+}
diff --git a/libraries-3/src/test/java/com/baeldung/moshi/ComplexAdapterUnitTest.java b/libraries-3/src/test/java/com/baeldung/moshi/ComplexAdapterUnitTest.java
new file mode 100644
index 0000000000..f0f8e9a95d
--- /dev/null
+++ b/libraries-3/src/test/java/com/baeldung/moshi/ComplexAdapterUnitTest.java
@@ -0,0 +1,94 @@
+package com.baeldung.moshi;
+
+import java.io.IOException;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+
+import com.squareup.moshi.FromJson;
+import com.squareup.moshi.JsonAdapter;
+import com.squareup.moshi.Moshi;
+import com.squareup.moshi.ToJson;
+import org.junit.Test;
+
+public class ComplexAdapterUnitTest {
+ @Test
+ public void whenSerializing_thenCorrectJsonProduced() {
+ Moshi moshi = new Moshi.Builder()
+ .add(new JsonDateTimeAdapter())
+ .build();
+ JsonAdapter jsonAdapter = moshi.adapter(ZonedDateTime.class);
+
+ String json = jsonAdapter.toJson(ZonedDateTime.now());
+ System.out.println(json);
+ }
+
+ @Test
+ public void whenDeserializing_thenCorrectJsonConsumed() throws IOException {
+ Moshi moshi = new Moshi.Builder()
+ .add(new JsonDateTimeAdapter())
+ .build();
+ JsonAdapter jsonAdapter = moshi.adapter(ZonedDateTime.class);
+
+ String json = "{\"date\":\"2020-02-17\",\"time\":\"07:53:27.064\",\"timezone\":\"Europe/London\"}";
+ ZonedDateTime now = jsonAdapter.fromJson(json);
+ System.out.println(now);
+
+ }
+
+ public static class JsonDateTimeAdapter {
+ @ToJson
+ public JsonDateTime toJson(ZonedDateTime input) {
+ String date = input.toLocalDate().toString();
+ String time = input.toLocalTime().toString();
+ String timezone = input.getZone().toString();
+ return new JsonDateTime(date, time, timezone);
+ }
+ @FromJson
+ public ZonedDateTime fromJson(JsonDateTime input) {
+ LocalDate date = LocalDate.parse(input.getDate());
+ LocalTime time = LocalTime.parse(input.getTime());
+ ZoneId timezone = ZoneId.of(input.getTimezone());
+ return ZonedDateTime.of(date, time, timezone);
+ }
+ }
+ public static class JsonDateTime {
+ private String date;
+ private String time;
+ private String timezone;
+
+ public JsonDateTime() {
+ }
+
+ public JsonDateTime(String date, String time, String timezone) {
+ this.date = date;
+ this.time = time;
+ this.timezone = timezone;
+ }
+
+ public String getDate() {
+ return date;
+ }
+
+ public void setDate(String date) {
+ this.date = date;
+ }
+
+ public String getTime() {
+ return time;
+ }
+
+ public void setTime(String time) {
+ this.time = time;
+ }
+
+ public String getTimezone() {
+ return timezone;
+ }
+
+ public void setTimezone(String timezone) {
+ this.timezone = timezone;
+ }
+ }
+}
diff --git a/libraries-3/src/test/java/com/baeldung/moshi/DefaultUnitTest.java b/libraries-3/src/test/java/com/baeldung/moshi/DefaultUnitTest.java
new file mode 100644
index 0000000000..0b4ecc23a5
--- /dev/null
+++ b/libraries-3/src/test/java/com/baeldung/moshi/DefaultUnitTest.java
@@ -0,0 +1,68 @@
+package com.baeldung.moshi;
+
+import java.io.IOException;
+import java.time.Instant;
+
+import com.squareup.moshi.JsonAdapter;
+import com.squareup.moshi.Moshi;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.junit.Test;
+
+public class DefaultUnitTest {
+
+ @Test
+ public void whenDeserializing_thenFieldsGetDefaultValues() throws IOException {
+ Moshi moshi = new Moshi.Builder()
+ .build();
+ JsonAdapter jsonAdapter = moshi.adapter(Post.class);
+
+ String json = "{\"title\":\"My Post\"}";
+ Post post = jsonAdapter.fromJson(json);
+ System.out.println(post);
+ }
+ public static class Post {
+ private String title;
+ private String author;
+ private String posted;
+
+ public Post() {
+ posted = Instant.now().toString();
+ }
+
+ public Post(String title, String author, String posted) {
+ this.title = title;
+ this.author = author;
+ this.posted = posted;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+ public String getPosted() {
+ return posted;
+ }
+
+ public void setPosted(String posted) {
+ this.posted = posted;
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this).append("title", title).append("author", author).append("posted", posted)
+ .toString();
+ }
+ }
+}
diff --git a/libraries-3/src/test/java/com/baeldung/moshi/PrimitiveUnitTest.java b/libraries-3/src/test/java/com/baeldung/moshi/PrimitiveUnitTest.java
new file mode 100644
index 0000000000..e26e93ba8c
--- /dev/null
+++ b/libraries-3/src/test/java/com/baeldung/moshi/PrimitiveUnitTest.java
@@ -0,0 +1,77 @@
+package com.baeldung.moshi;
+
+import java.io.IOException;
+
+import com.squareup.moshi.JsonAdapter;
+import com.squareup.moshi.Moshi;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.junit.Test;
+
+public class PrimitiveUnitTest {
+ @Test
+ public void whenSerializing_thenCorrectJsonProduced() {
+ Moshi moshi = new Moshi.Builder()
+ .build();
+ JsonAdapter jsonAdapter = moshi.adapter(Post.class);
+
+ Post post = new Post("My Post", "Baeldung", "This is my post");
+ String json = jsonAdapter.toJson(post);
+ System.out.println(json);
+ }
+
+ @Test
+ public void whenDeserializing_thenCorrectJsonConsumed() throws IOException {
+ Moshi moshi = new Moshi.Builder()
+ .build();
+ JsonAdapter jsonAdapter = moshi.adapter(Post.class);
+
+ String json = "{\"author\":\"Baeldung\",\"text\":\"This is my post\",\"title\":\"My Post\"}";
+ Post post = jsonAdapter.fromJson(json);
+ System.out.println(post);
+ }
+
+ public static class Post {
+ private String title;
+ private String author;
+ private String text;
+
+ public Post() {
+ }
+
+ public Post(String title, String author, String text) {
+ this.title = title;
+ this.author = author;
+ this.text = text;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this).append("title", title).append("author", author).append("text", text)
+ .toString();
+ }
+ }
+}
diff --git a/libraries-3/src/test/java/com/baeldung/moshi/RenameUnitTest.java b/libraries-3/src/test/java/com/baeldung/moshi/RenameUnitTest.java
new file mode 100644
index 0000000000..2118538a19
--- /dev/null
+++ b/libraries-3/src/test/java/com/baeldung/moshi/RenameUnitTest.java
@@ -0,0 +1,68 @@
+package com.baeldung.moshi;
+
+import java.io.IOException;
+
+import com.squareup.moshi.Json;
+import com.squareup.moshi.JsonAdapter;
+import com.squareup.moshi.Moshi;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.junit.jupiter.api.Test;
+
+public class RenameUnitTest {
+
+ @Test
+ public void whenSerializing_thenFieldsGetRenamed() {
+ Moshi moshi = new Moshi.Builder()
+ .build();
+ JsonAdapter jsonAdapter = moshi.adapter(Post.class);
+
+ Post post = new Post("My Post", "Baeldung");
+ String json = jsonAdapter.toJson(post);
+ System.out.println(json);
+ }
+
+ @Test
+ public void whenSerializing_thenRenamedFieldsGetConsumed() throws IOException {
+ Moshi moshi = new Moshi.Builder()
+ .build();
+ JsonAdapter jsonAdapter = moshi.adapter(Post.class);
+
+ String json = "{\"authored_by\":\"Baeldung\",\"title\":\"My Post\"}";
+ Post post = jsonAdapter.fromJson(json);
+ System.out.println(post);
+ }
+ public static class Post {
+ private String title;
+ @Json(name = "authored_by")
+ private String author;
+
+ public Post() {
+ }
+
+ public Post(String title, String author) {
+ this.title = title;
+ this.author = author;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this).append("title", title).append("author", author).toString();
+ }
+ }
+}
diff --git a/libraries-3/src/test/java/com/baeldung/moshi/SimpleAdapterUnitTest.java b/libraries-3/src/test/java/com/baeldung/moshi/SimpleAdapterUnitTest.java
new file mode 100644
index 0000000000..e0be2f8a66
--- /dev/null
+++ b/libraries-3/src/test/java/com/baeldung/moshi/SimpleAdapterUnitTest.java
@@ -0,0 +1,129 @@
+package com.baeldung.moshi;
+
+import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import com.squareup.moshi.FromJson;
+import com.squareup.moshi.JsonAdapter;
+import com.squareup.moshi.Moshi;
+import com.squareup.moshi.ToJson;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.junit.Test;
+
+public class SimpleAdapterUnitTest {
+ @Test
+ public void whenSerializing_thenAdapterUsed() {
+ Moshi moshi = new Moshi.Builder()
+ .add(new AuthorAdapter())
+ .build();
+ JsonAdapter jsonAdapter = moshi.adapter(Post.class);
+
+ Post post = new Post("My Post", new Author("Baeldung", "baeldung@example.com"), "This is my post");
+ String json = jsonAdapter.toJson(post);
+ System.out.println(json);
+ }
+
+ @Test
+ public void whenDeserializing_thenAdapterUsed() throws IOException {
+ Moshi moshi = new Moshi.Builder()
+ .add(new AuthorAdapter())
+ .build();
+ JsonAdapter jsonAdapter = moshi.adapter(Post.class);
+
+ String json = "{\"author\":\"Baeldung \",\"text\":\"This is my post\",\"title\":\"My Post\"}";
+ Post post = jsonAdapter.fromJson(json);
+ System.out.println(post);
+ }
+ public static class AuthorAdapter {
+ private Pattern pattern = Pattern.compile("^(.*) <(.*)>$");
+ @ToJson
+ public String toJson(Author author) {
+ return author.name + " <" + author.email + ">";
+ }
+
+ @FromJson
+ public Author fromJson(String author) {
+ Matcher matcher = pattern.matcher(author);
+ return matcher.find() ? new Author(matcher.group(1), matcher.group(2)) : null;
+ }
+ }
+
+ public static class Author {
+ private String name;
+ private String email;
+
+ public Author() {
+ }
+
+ public Author(String name, String email) {
+ this.name = name;
+ this.email = email;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this).append("name", name).append("email", email).toString();
+ }
+ }
+ public static class Post {
+ private String title;
+ private Author author;
+ private String text;
+
+ public Post() {
+ }
+
+ public Post(String title, Author author, String text) {
+ this.title = title;
+ this.author = author;
+ this.text = text;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public Author getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(Author author) {
+ this.author = author;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this).append("title", title).append("author", author).append("text", text)
+ .toString();
+ }
+ }
+}
diff --git a/libraries-3/src/test/java/com/baeldung/moshi/TransientUnitTest.java b/libraries-3/src/test/java/com/baeldung/moshi/TransientUnitTest.java
new file mode 100644
index 0000000000..2554e937b3
--- /dev/null
+++ b/libraries-3/src/test/java/com/baeldung/moshi/TransientUnitTest.java
@@ -0,0 +1,66 @@
+package com.baeldung.moshi;
+
+import java.io.IOException;
+
+import com.squareup.moshi.JsonAdapter;
+import com.squareup.moshi.Moshi;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.junit.jupiter.api.Test;
+
+public class TransientUnitTest {
+
+ @Test
+ public void whenSerializing_thenTransientFieldIgnored() {
+ Moshi moshi = new Moshi.Builder()
+ .build();
+ JsonAdapter jsonAdapter = moshi.adapter(Post.class);
+
+ Post post = new Post("My Post", "Baeldung");
+ String json = jsonAdapter.toJson(post);
+ System.out.println(json);
+ }
+
+ @Test
+ public void whenDeserializing_thenTransientFieldIgnored() throws IOException {
+ Moshi moshi = new Moshi.Builder()
+ .build();
+ JsonAdapter jsonAdapter = moshi.adapter(Post.class);
+
+ String json = "{\"authored_by\":\"Baeldung\",\"title\":\"My Post\"}";
+ Post post = jsonAdapter.fromJson(json);
+ System.out.println(post);
+ }
+ public static class Post {
+ private String title;
+ private transient String author;
+
+ public Post() {
+ }
+
+ public Post(String title, String author) {
+ this.title = title;
+ this.author = author;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+ @Override
+ public String toString() {
+ return new ToStringBuilder(this).append("title", title).append("author", author).toString();
+ }
+ }
+}
diff --git a/libraries-3/src/test/java/com/baeldung/takes/TakesAppIntegrationTest.java b/libraries-3/src/test/java/com/baeldung/takes/TakesAppIntegrationTest.java
new file mode 100644
index 0000000000..8b869d0742
--- /dev/null
+++ b/libraries-3/src/test/java/com/baeldung/takes/TakesAppIntegrationTest.java
@@ -0,0 +1,36 @@
+package com.baeldung.takes;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.util.EntityUtils;
+import org.junit.Test;
+import org.takes.http.FtRemote;
+
+public class TakesAppIntegrationTest {
+
+ @Test
+ public void givenTake_whenRunRemoteServer_thenRespond() throws Exception {
+ new FtRemote(new TakesContact()).exec(
+ new FtRemote.Script() {
+ @Override
+ public void exec(final URI home) throws IOException {
+ HttpClient client = HttpClientBuilder.create().build();
+ HttpResponse response = client.execute(new HttpGet(home));
+ int statusCode = response.getStatusLine().getStatusCode();
+ HttpEntity entity = response.getEntity();
+ String result = EntityUtils.toString(entity);
+
+ assertEquals(200, statusCode);
+ assertEquals("Contact us at https://www.baeldung.com", result);
+ }
+ });
+ }
+}
diff --git a/libraries-3/src/test/java/com/baeldung/takes/TakesContactUnitTest.java b/libraries-3/src/test/java/com/baeldung/takes/TakesContactUnitTest.java
new file mode 100644
index 0000000000..5f8b7c57fc
--- /dev/null
+++ b/libraries-3/src/test/java/com/baeldung/takes/TakesContactUnitTest.java
@@ -0,0 +1,17 @@
+package com.baeldung.takes;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.takes.rq.RqFake;
+import org.takes.rs.RsPrint;
+
+public class TakesContactUnitTest {
+
+ @Test
+ public void givenTake_whenInvokeActMethod_thenRespond() throws Exception {
+ final String resp = new RsPrint(new TakesContact().act(new RqFake())).printBody();
+ assertEquals("Contact us at https://www.baeldung.com", resp);
+ }
+
+}
diff --git a/libraries/pom.xml b/libraries/pom.xml
index b5340d1ebb..af300657b0 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -435,7 +435,23 @@
reflections${reflections.version}
-
+
+ com.uber.nullaway
+ nullaway
+ 0.3.0
+
+
+ org.codehaus.plexus
+ plexus-compiler-javac-errorprone
+ 2.8
+
+
+
+ com.google.errorprone
+ error_prone_core
+ 2.1.3
+
@@ -552,6 +568,47 @@
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.5
+
+ javac-with-errorprone
+ true
+ 1.8
+ 1.8
+ true
+
+
+ com.uber.nullaway
+ nullaway
+ 0.3.0
+
+
+
+
+
+ -XepExcludedPaths:(.*)/test/.*|(.*)/streamex/.*
+ -XepOpt:NullAway:AnnotatedPackages=com.baeldung.nullaway
+
+
+
+
+ org.codehaus.plexus
+ plexus-compiler-javac-errorprone
+ 2.8
+
+
+
+ com.google.errorprone
+ error_prone_core
+ 2.1.3
+
+
+
+
diff --git a/libraries/src/main/java/com/baeldung/nullaway/NullAwayExample.java b/libraries/src/main/java/com/baeldung/nullaway/NullAwayExample.java
new file mode 100644
index 0000000000..f3db1d2df9
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/nullaway/NullAwayExample.java
@@ -0,0 +1,24 @@
+package com.baeldung.nullaway;
+
+import com.baeldung.distinct.Person;
+
+public class NullAwayExample {
+
+ /*
+ * 1- NullAway will warn about yearsToRetirement method
+ * 2- Uncomment @Nullable in printAge and NullAway will warn about this method
+ * 3- Add a standard null check to be NullAway compliant
+ * 4- Build will be SUCCESS
+ */
+
+ static Integer getAge(/*@Nullable*/ Person person) {
+ return person.getAge();
+ }
+
+ Integer yearsToRetirement() {
+ Person p = null;
+ // ... p never gets set correctly...
+ return 65 - getAge(p);
+ }
+
+}
\ No newline at end of file
diff --git a/linux-bash/text/README.md b/linux-bash/text/README.md
index e0ee0c1600..de99c1962a 100644
--- a/linux-bash/text/README.md
+++ b/linux-bash/text/README.md
@@ -1,3 +1,3 @@
### Relevant Articles:
-- [Linux Commands – Remove All Text After X](https://www.baeldung.com/linux/remove-text-after-x-in-file)
+- [Linux Commands – Remove All Text After X](https://www.baeldung.com/linux/tr-manipulate-strings)
diff --git a/lombok-custom/pom.xml b/lombok-custom/pom.xml
index 1455a4f6c6..220367bfe9 100644
--- a/lombok-custom/pom.xml
+++ b/lombok-custom/pom.xml
@@ -36,12 +36,12 @@
- default-tools.jar
+ default-profile
-
- java.vendor
- Oracle Corporation
-
+ true
+
+ ${java.home}/../lib/tools.jar
+
diff --git a/maven-all/compiler-plugin-java-9/README.md b/maven-all/compiler-plugin-java-9/README.md
index d0b7b72acc..0e02d56946 100644
--- a/maven-all/compiler-plugin-java-9/README.md
+++ b/maven-all/compiler-plugin-java-9/README.md
@@ -1,3 +1,3 @@
### Relevant Articles
-- [Maven Compiler Plugin](http://www.baeldung.com/maven-compiler-plugin)
\ No newline at end of file
+- [Maven Compiler Plugin](https://www.baeldung.com/maven-compiler-plugin)
diff --git a/maven-java-11/README.md b/maven-java-11/README.md
index fcb6ea3f06..b923518825 100644
--- a/maven-java-11/README.md
+++ b/maven-java-11/README.md
@@ -4,4 +4,3 @@ This module contains articles about Maven with Java 11+.
### Relevant Articles:
-- [Multi-Module Maven Application with Java Modules](https://www.baeldung.com/maven-multi-module-project-java-jpms)
diff --git a/muleesb/pom.xml b/muleesb/pom.xml
index c8468c1e00..e7c7e50cbe 100644
--- a/muleesb/pom.xml
+++ b/muleesb/pom.xml
@@ -83,7 +83,7 @@
com.mulesoft.munitmule-munit-support
- ${mule.munit.support.version}
+ ${mule.version}test
@@ -106,18 +106,19 @@
- org.mule.tools
- muleesb-maven-plugin
- ${muleesb-maven-plugin.version}
+ org.mule.tools.maven
+ mule-maven-plugin
+ 2.2.1
+ standalone${mule.version}
- /home/abir/AnypointStudio/workspace/variablescopetestdeploy
+ deploy
- start
+ deploy
@@ -210,11 +211,9 @@
- 3.8.1
+ 3.9.01.21.3.6
- 3.9.0
- 1.01.7
diff --git a/netflix-modules/README.md b/netflix-modules/README.md
index 4afea527df..7f7a9656fb 100644
--- a/netflix-modules/README.md
+++ b/netflix-modules/README.md
@@ -4,4 +4,4 @@ This module contains articles about Netflix.
### Relevant articles
-- [Introduction to Netflix Genie](https://github.com/eugenp/tutorials/tree/master/netflix/genie)
+- [Introduction to Netflix Genie](https://www.baeldung.com/netflix-genie-intro)
diff --git a/oauth2-framework-impl/oauth2-client/README.md b/oauth2-framework-impl/oauth2-client/README.md
deleted file mode 100644
index 4bcb9790b1..0000000000
--- a/oauth2-framework-impl/oauth2-client/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Relevant Articles:
-
-- [Implementing The OAuth 2.0 Authorization Framework Using Jakarta EE](https://www.baeldung.com/java-ee-oauth2-implementation)
diff --git a/persistence-modules/java-jpa-2/README.md b/persistence-modules/java-jpa-2/README.md
index 1c34ef2999..9d46c0d814 100644
--- a/persistence-modules/java-jpa-2/README.md
+++ b/persistence-modules/java-jpa-2/README.md
@@ -5,7 +5,7 @@ This module contains articles about the Java Persistence API (JPA) in Java.
### Relevant Articles
- [JPA Query Parameters Usage](https://www.baeldung.com/jpa-query-parameters)
-- [Mapping Entitiy Class Names to SQL Table Names with JPA](https://www.baeldung.com/jpa-entity-table-names)
+- [Mapping Entity Class Names to SQL Table Names with JPA](https://www.baeldung.com/jpa-entity-table-names)
- [Default Column Values in JPA](https://www.baeldung.com/jpa-default-column-values)
- [Types of JPA Queries](https://www.baeldung.com/jpa-queries)
- [JPA/Hibernate Projections](https://www.baeldung.com/jpa-hibernate-projections)
diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/resources/application.properties b/persistence-modules/spring-boot-persistence-mongodb/src/main/resources/application.properties
index 6548f2b28a..65e65cc96c 100644
--- a/persistence-modules/spring-boot-persistence-mongodb/src/main/resources/application.properties
+++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/resources/application.properties
@@ -3,7 +3,7 @@ server.port=8082
#spring boot mongodb
spring.data.mongodb.host=localhost
-spring.data.mongodb.port=27017
+spring.data.mongodb.port=0
spring.data.mongodb.database=springboot-mongo
spring.thymeleaf.cache=false
diff --git a/persistence-modules/spring-data-jpa-4/pom.xml b/persistence-modules/spring-data-jpa-4/pom.xml
index e0b441231e..8a476012c7 100644
--- a/persistence-modules/spring-data-jpa-4/pom.xml
+++ b/persistence-modules/spring-data-jpa-4/pom.xml
@@ -23,6 +23,16 @@
spring-boot-starter-data-jpa
+
+ org.springframework.boot
+ spring-boot-starter-data-jdbc
+
+
+
+ mysql
+ mysql-connector-java
+
+
com.h2databaseh2
diff --git a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/storedprocedure/StoredProcedureApplication.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/storedprocedure/StoredProcedureApplication.java
new file mode 100644
index 0000000000..5f05764e21
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/storedprocedure/StoredProcedureApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung.storedprocedure;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class StoredProcedureApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(StoredProcedureApplication.class, args);
+ }
+
+}
diff --git a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/storedprocedure/controller/CarController.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/storedprocedure/controller/CarController.java
new file mode 100644
index 0000000000..6aef600d01
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/storedprocedure/controller/CarController.java
@@ -0,0 +1,47 @@
+package com.baeldung.storedprocedure.controller;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.baeldung.storedprocedure.entity.Car;
+import com.baeldung.storedprocedure.service.CarService;
+
+@RestController
+public class CarController {
+ @Autowired
+ private CarService carService;
+
+ @GetMapping(path = "/modelcount")
+ public long getTotalCarsByModel(@RequestParam("model") String model) {
+ return carService.getTotalCarsByModel(model);
+ }
+
+ @GetMapping(path = "/modelcountP")
+ public long getTotalCarsByModelProcedureName(@RequestParam("model") String model) {
+ return carService.getTotalCarsByModelProcedureName(model);
+ }
+
+ @GetMapping(path = "/modelcountV")
+ public long getTotalCarsByModelVaue(@RequestParam("model") String model) {
+ return carService.getTotalCarsByModelValue(model);
+ }
+
+ @GetMapping(path = "/modelcountEx")
+ public long getTotalCarsByModelExplicit(@RequestParam("model") String model) {
+ return carService.getTotalCarsByModelExplicit(model);
+ }
+
+ @GetMapping(path = "/modelcountEn")
+ public long getTotalCarsByModelEntity(@RequestParam("model") String model) {
+ return carService.getTotalCarsByModelEntity(model);
+ }
+
+ @GetMapping(path = "/carsafteryear")
+ public List findCarsAfterYear(@RequestParam("year") Integer year) {
+ return carService.findCarsAfterYear(year);
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/storedprocedure/entity/Car.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/storedprocedure/entity/Car.java
new file mode 100644
index 0000000000..2817c25ff7
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/storedprocedure/entity/Car.java
@@ -0,0 +1,41 @@
+package com.baeldung.storedprocedure.entity;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.NamedStoredProcedureQuery;
+import javax.persistence.StoredProcedureParameter;
+import javax.persistence.ParameterMode;
+
+@Entity
+@NamedStoredProcedureQuery(name = "Car.getTotalCardsbyModelEntity", procedureName = "GET_TOTAL_CARS_BY_MODEL", parameters = {
+ @StoredProcedureParameter(mode = ParameterMode.IN, name = "model_in", type = String.class),
+ @StoredProcedureParameter(mode = ParameterMode.OUT, name = "count_out", type = Integer.class) })
+
+public class Car {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Column
+ private long id;
+
+ @Column
+ private String model;
+
+ @Column
+ private Integer year;
+
+ public long getId() {
+ return id;
+ }
+
+ public String getModel() {
+ return model;
+ }
+
+ public Integer getYear() {
+ return year;
+ }
+
+}
diff --git a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/storedprocedure/repository/CarRepository.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/storedprocedure/repository/CarRepository.java
new file mode 100644
index 0000000000..3d9428628e
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/storedprocedure/repository/CarRepository.java
@@ -0,0 +1,34 @@
+package com.baeldung.storedprocedure.repository;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.jpa.repository.query.Procedure;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import com.baeldung.storedprocedure.entity.Car;
+
+@Repository
+public interface CarRepository extends JpaRepository {
+
+ @Procedure
+ int GET_TOTAL_CARS_BY_MODEL(String model);
+
+ @Procedure("GET_TOTAL_CARS_BY_MODEL")
+ int getTotalCarsByModel(String model);
+
+ @Procedure(procedureName = "GET_TOTAL_CARS_BY_MODEL")
+ int getTotalCarsByModelProcedureName(String model);
+
+ @Procedure(value = "GET_TOTAL_CARS_BY_MODEL")
+ int getTotalCarsByModelValue(String model);
+
+ @Procedure(name = "Car.getTotalCardsbyModelEntity")
+ int getTotalCarsByModelEntiy(@Param("model_in") String model);
+
+ @Query(value = "CALL FIND_CARS_AFTER_YEAR(:year_in);", nativeQuery = true)
+ List findCarsAfterYear(@Param("year_in") Integer year_in);
+
+}
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/storedprocedure/service/CarService.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/storedprocedure/service/CarService.java
new file mode 100644
index 0000000000..104f46e324
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/storedprocedure/service/CarService.java
@@ -0,0 +1,39 @@
+package com.baeldung.storedprocedure.service;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.baeldung.storedprocedure.entity.Car;
+import com.baeldung.storedprocedure.repository.CarRepository;
+
+@Service
+public class CarService {
+ @Autowired
+ private CarRepository carRepository;
+
+ public int getTotalCarsByModel(String model) {
+ return carRepository.getTotalCarsByModel(model);
+ }
+
+ public int getTotalCarsByModelProcedureName(String model) {
+ return carRepository.getTotalCarsByModelProcedureName(model);
+ }
+
+ public int getTotalCarsByModelValue(String model) {
+ return carRepository.getTotalCarsByModelValue(model);
+ }
+
+ public int getTotalCarsByModelExplicit(String model) {
+ return carRepository.GET_TOTAL_CARS_BY_MODEL(model);
+ }
+
+ public int getTotalCarsByModelEntity(String model) {
+ return carRepository.getTotalCarsByModelEntiy(model);
+ }
+
+ public List findCarsAfterYear(Integer year) {
+ return carRepository.findCarsAfterYear(year);
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-4/src/main/resources/application.properties b/persistence-modules/spring-data-jpa-4/src/main/resources/application.properties
index 72fc330767..65d7b0bf29 100644
--- a/persistence-modules/spring-data-jpa-4/src/main/resources/application.properties
+++ b/persistence-modules/spring-data-jpa-4/src/main/resources/application.properties
@@ -1 +1,5 @@
-spring.jpa.show-sql=true
\ No newline at end of file
+spring.jpa.show-sql=true
+#MySql
+#spring.datasource.url=jdbc:mysql://localhost:3306/baeldung
+#spring.datasource.username=baeldung
+#spring.datasource.password=baeldung
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-4/src/main/resources/car-mysql.sql b/persistence-modules/spring-data-jpa-4/src/main/resources/car-mysql.sql
new file mode 100644
index 0000000000..bb4ab2a86e
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-4/src/main/resources/car-mysql.sql
@@ -0,0 +1,27 @@
+DROP TABLE IF EXISTS car;
+
+CREATE TABLE car (id int(10) NOT NULL AUTO_INCREMENT,
+ model varchar(50) NOT NULL,
+ year int(4) NOT NULL,
+ PRIMARY KEY (id));
+
+INSERT INTO car (model, year) VALUES ('BMW', 2000);
+INSERT INTO car (model, year) VALUES ('BENZ', 2010);
+INSERT INTO car (model, year) VALUES ('PORCHE', 2005);
+INSERT INTO car (model, year) VALUES ('PORCHE', 2004);
+
+DELIMITER $$
+
+DROP PROCEDURE IF EXISTS FIND_CARS_AFTER_YEAR$$
+CREATE PROCEDURE FIND_CARS_AFTER_YEAR(IN year_in INT)
+BEGIN
+ SELECT * FROM car WHERE year >= year_in ORDER BY year;
+END$$
+
+DROP PROCEDURE IF EXISTS GET_TOTAL_CARS_BY_MODEL$$
+CREATE PROCEDURE GET_TOTAL_CARS_BY_MODEL(IN model_in VARCHAR(50), OUT count_out INT)
+BEGIN
+ SELECT COUNT(*) into count_out from car WHERE model = model_in;
+END$$
+
+DELIMITER ;
diff --git a/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/config/RedisConfig.java b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/config/RedisConfig.java
index 6fdb3c5bef..fdc279be42 100644
--- a/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/config/RedisConfig.java
+++ b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/config/RedisConfig.java
@@ -1,13 +1,11 @@
package com.baeldung.spring.data.redis.config;
-import com.baeldung.spring.data.redis.queue.MessagePublisher;
-import com.baeldung.spring.data.redis.queue.RedisMessagePublisher;
-import com.baeldung.spring.data.redis.queue.RedisMessageSubscriber;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
@@ -15,6 +13,10 @@ import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import org.springframework.data.redis.repository.configuration.EnableRedisRepositories;
import org.springframework.data.redis.serializer.GenericToStringSerializer;
+import com.baeldung.spring.data.redis.queue.MessagePublisher;
+import com.baeldung.spring.data.redis.queue.RedisMessagePublisher;
+import com.baeldung.spring.data.redis.queue.RedisMessageSubscriber;
+
@Configuration
@ComponentScan("com.baeldung.spring.data.redis")
@EnableRedisRepositories(basePackages = "com.baeldung.spring.data.redis.repo")
@@ -33,6 +35,18 @@ public class RedisConfig {
template.setValueSerializer(new GenericToStringSerializerorg.hamcrest
- hamcrest-core
- ${org.hamcrest.version}
- test
-
-
- org.hamcrest
- hamcrest-library
- ${org.hamcrest.version}
+ hamcrest
+ ${hamcrest.version}testorg.hamcresthamcrest-all
- ${org.hamcrest.version}
+ ${hamcrest-all.version}test
@@ -408,6 +402,7 @@
daggerdata-structuresddd
+
deeplearning4jdisruptordozer
@@ -639,9 +634,8 @@
spring-batchspring-bomspring-boot-modules
- spring-boot-parentspring-boot-rest
-
+
spring-cachingspring-cloud
@@ -729,6 +723,7 @@
spring-static-resourcesspring-swagger-codegen
+ spring-threadsspring-thymeleafspring-thymeleaf-2
@@ -861,6 +856,7 @@
antlrapache-avro
+ apache-beamapache-bvalapache-curatorapache-cxf
@@ -919,6 +915,7 @@
daggerdata-structuresddd
+
deeplearning4jdisruptordozer
@@ -1141,7 +1138,6 @@
spring-batchspring-bomspring-boot-modules
- spring-boot-parentspring-boot-restspring-caching
@@ -1332,17 +1328,18 @@
false4.12
- 1.3
+ 2.2
+ 1.32.21.0
- 1.7.21
- 1.1.7
+ 1.7.30
+ 1.2.32.21.0
- 3.7.0
+ 3.8.11.6.01.81.2.17
@@ -1350,7 +1347,6 @@
2.1.0.11.191.19
- 1.31.6.02.21.02.5
@@ -1368,7 +1364,7 @@
1.2.05.2.00.3.1
- 2.5.1
+ 2.5.20.0.13.82.3
diff --git a/spring-5-webflux/src/main/java/com/baeldung/spring/serverconfig/TimeoutController.java b/spring-5-webflux/src/main/java/com/baeldung/spring/serverconfig/TimeoutController.java
new file mode 100644
index 0000000000..a4cd6bd6ba
--- /dev/null
+++ b/spring-5-webflux/src/main/java/com/baeldung/spring/serverconfig/TimeoutController.java
@@ -0,0 +1,23 @@
+package com.baeldung.spring.serverconfig;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import reactor.core.publisher.Mono;
+
+@RestController
+@RequestMapping("/timeout")
+public class TimeoutController {
+
+ @GetMapping("/{timeout}")
+ private Mono timeout(@PathVariable int timeout) {
+ try {
+ Thread.sleep(timeout * 1000);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ return Mono.just("OK");
+ }
+}
diff --git a/spring-5-webflux/src/test/java/com/baeldung/spring/serverconfig/TimeoutLiveTest.java b/spring-5-webflux/src/test/java/com/baeldung/spring/serverconfig/TimeoutLiveTest.java
new file mode 100644
index 0000000000..c53fd4fa80
--- /dev/null
+++ b/spring-5-webflux/src/test/java/com/baeldung/spring/serverconfig/TimeoutLiveTest.java
@@ -0,0 +1,85 @@
+package com.baeldung.spring.serverconfig;
+
+import java.util.concurrent.TimeUnit;
+
+import javax.net.ssl.SSLException;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.http.client.reactive.ReactorClientHttpConnector;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.reactive.server.WebTestClient;
+
+import io.netty.channel.ChannelOption;
+import io.netty.handler.ssl.SslContext;
+import io.netty.handler.ssl.SslContextBuilder;
+import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
+import io.netty.handler.timeout.ReadTimeoutException;
+import io.netty.handler.timeout.ReadTimeoutHandler;
+import io.netty.handler.timeout.WriteTimeoutHandler;
+import reactor.netty.http.client.HttpClient;
+import reactor.netty.tcp.TcpClient;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT)
+@DirtiesContext
+public class TimeoutLiveTest {
+
+ private static final String BASE_URL = "https://localhost:8443";
+ private static final int TIMEOUT_MILLIS = 2000;
+
+ private WebTestClient webTestClient;
+
+ @Rule
+ public ExpectedException exception = ExpectedException.none();
+
+ @Before
+ public void setup() throws SSLException {
+ webTestClient = WebTestClient.bindToServer(getConnector())
+ .baseUrl(BASE_URL)
+ .build();
+ }
+
+ @Test
+ public void shouldTimeout() {
+ exception.expect(ReadTimeoutException.class);
+ webTestClient.get()
+ .uri("/timeout/{timeout}", 3)
+ .exchange();
+ }
+
+ @Test
+ public void shouldNotTimeout() {
+ WebTestClient.ResponseSpec response = webTestClient.get()
+ .uri("/timeout/{timeout}", 1)
+ .exchange();
+ response.expectStatus()
+ .isOk()
+ .expectBody(String.class)
+ .isEqualTo("OK");
+ }
+
+ private ReactorClientHttpConnector getConnector() throws SSLException {
+ SslContext sslContext = SslContextBuilder
+ .forClient()
+ .trustManager(InsecureTrustManagerFactory.INSTANCE)
+ .build();
+
+ TcpClient tcpClient = TcpClient
+ .create()
+ .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, TIMEOUT_MILLIS)
+ .doOnConnected(connection -> {
+ connection.addHandlerLast(new ReadTimeoutHandler(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS));
+ connection.addHandlerLast(new WriteTimeoutHandler(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS));
+ });
+
+ HttpClient httpClient = HttpClient.from(tcpClient).secure(t -> t.sslContext(sslContext));
+ return new ReactorClientHttpConnector(httpClient);
+ }
+}
diff --git a/spring-5/pom.xml b/spring-5/pom.xml
index a242c29933..eadfb5e512 100644
--- a/spring-5/pom.xml
+++ b/spring-5/pom.xml
@@ -149,7 +149,6 @@
- 2.1.9.RELEASE1.01.5.64.1
diff --git a/spring-5/src/main/java/com/baeldung/restdocs/CRUDController.java b/spring-5/src/main/java/com/baeldung/restdocs/CRUDController.java
index 429d3f433a..b10cfd5f55 100644
--- a/spring-5/src/main/java/com/baeldung/restdocs/CRUDController.java
+++ b/spring-5/src/main/java/com/baeldung/restdocs/CRUDController.java
@@ -1,6 +1,6 @@
package com.baeldung.restdocs;
-import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
import java.util.ArrayList;
import java.util.List;
diff --git a/spring-5/src/main/java/com/baeldung/restdocs/IndexController.java b/spring-5/src/main/java/com/baeldung/restdocs/IndexController.java
index 2c58d5fe6b..b1516f43c5 100644
--- a/spring-5/src/main/java/com/baeldung/restdocs/IndexController.java
+++ b/spring-5/src/main/java/com/baeldung/restdocs/IndexController.java
@@ -1,21 +1,25 @@
package com.baeldung.restdocs;
-import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
-
-import org.springframework.hateoas.ResourceSupport;
+import org.springframework.hateoas.Link;
+import org.springframework.hateoas.RepresentationModel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
+
@RestController
@RequestMapping("/")
public class IndexController {
- @GetMapping
- public ResourceSupport index() {
- ResourceSupport index = new ResourceSupport();
- index.add(linkTo(CRUDController.class).withRel("crud"));
- return index;
+ static class CustomRepresentationModel extends RepresentationModel {
+ public CustomRepresentationModel(Link initialLink) {
+ super(initialLink);
+ }
}
+ @GetMapping
+ public CustomRepresentationModel index() {
+ return new CustomRepresentationModel(linkTo(CRUDController.class).withRel("crud"));
+ }
}
\ No newline at end of file
diff --git a/spring-5/src/main/java/com/baeldung/version/VersionObtainer.java b/spring-5/src/main/java/com/baeldung/version/VersionObtainer.java
new file mode 100644
index 0000000000..392cc44a72
--- /dev/null
+++ b/spring-5/src/main/java/com/baeldung/version/VersionObtainer.java
@@ -0,0 +1,20 @@
+package com.baeldung.version;
+
+import org.springframework.boot.system.JavaVersion;
+import org.springframework.boot.system.SystemProperties;
+import org.springframework.core.SpringVersion;
+
+public class VersionObtainer {
+
+ public String getSpringVersion() {
+ return SpringVersion.getVersion();
+ }
+
+ public String getJavaVersion() {
+ return JavaVersion.getJavaVersion().toString();
+ }
+
+ public String getJdkVersion() {
+ return SystemProperties.get("java.version");
+ }
+}
diff --git a/spring-5/src/test/java/com/baeldung/version/VersionObtainerUnitTest.java b/spring-5/src/test/java/com/baeldung/version/VersionObtainerUnitTest.java
new file mode 100644
index 0000000000..6d77cd1403
--- /dev/null
+++ b/spring-5/src/test/java/com/baeldung/version/VersionObtainerUnitTest.java
@@ -0,0 +1,30 @@
+package com.baeldung.version;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest(classes = VersionObtainer.class)
+public class VersionObtainerUnitTest {
+
+ public VersionObtainer version = new VersionObtainer();
+
+ @Test
+ public void testGetSpringVersion() {
+ String res = version.getSpringVersion();
+ assertThat(res).isNotEmpty();
+ }
+
+ @Test
+ public void testGetJdkVersion() {
+ String res = version.getJdkVersion();
+ assertThat(res).isNotEmpty();
+ }
+
+ @Test
+ public void testGetJavaVersion() {
+ String res = version.getJavaVersion();
+ assertThat(res).isNotEmpty();
+ }
+}
diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/ExponentialBackoffApp.java b/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/ExponentialBackoffApp.java
new file mode 100644
index 0000000000..182880cc7e
--- /dev/null
+++ b/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/ExponentialBackoffApp.java
@@ -0,0 +1,11 @@
+package com.baeldung.springamqp.exponentialbackoff;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class ExponentialBackoffApp {
+ public static void main(String[] args) {
+ SpringApplication.run(ExponentialBackoffApp.class, args);
+ }
+}
diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/ObservableRejectAndDontRequeueRecoverer.java b/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/ObservableRejectAndDontRequeueRecoverer.java
new file mode 100644
index 0000000000..700f7ab725
--- /dev/null
+++ b/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/ObservableRejectAndDontRequeueRecoverer.java
@@ -0,0 +1,21 @@
+package com.baeldung.springamqp.exponentialbackoff;
+
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.retry.RejectAndDontRequeueRecoverer;
+
+public class ObservableRejectAndDontRequeueRecoverer extends RejectAndDontRequeueRecoverer {
+ private Runnable observer;
+
+ @Override
+ public void recover(Message message, Throwable cause) {
+ if(observer != null) {
+ observer.run();
+ }
+
+ super.recover(message, cause);
+ }
+
+ void setObserver(Runnable observer){
+ this.observer = observer;
+ }
+}
diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/RabbitConfiguration.java b/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/RabbitConfiguration.java
new file mode 100644
index 0000000000..2335ecbf58
--- /dev/null
+++ b/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/RabbitConfiguration.java
@@ -0,0 +1,162 @@
+package com.baeldung.springamqp.exponentialbackoff;
+
+import org.aopalliance.aop.Advice;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.amqp.core.AmqpAdmin;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.core.MessageProperties;
+import org.springframework.amqp.core.Queue;
+import org.springframework.amqp.core.QueueBuilder;
+import org.springframework.amqp.rabbit.annotation.EnableRabbit;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.amqp.rabbit.config.RetryInterceptorBuilder;
+import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
+import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
+import org.springframework.amqp.rabbit.connection.ConnectionFactory;
+import org.springframework.amqp.rabbit.core.RabbitAdmin;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.retry.interceptor.RetryOperationsInterceptor;
+
+import com.rabbitmq.client.Channel;
+
+@EnableRabbit
+@Configuration
+public class RabbitConfiguration {
+
+ private static Logger logger = LoggerFactory.getLogger(RabbitConfiguration.class);
+
+ @Bean
+ public ConnectionFactory connectionFactory() {
+ return new CachingConnectionFactory("localhost");
+ }
+
+ @Bean
+ public AmqpAdmin amqpAdmin() {
+ return new RabbitAdmin(connectionFactory());
+ }
+
+ @Bean
+ public RabbitTemplate rabbitTemplate() {
+ return new RabbitTemplate(connectionFactory());
+ }
+
+ @Bean
+ public Queue blockingQueue() {
+ return QueueBuilder.nonDurable("blocking-queue")
+ .build();
+ }
+
+ @Bean
+ public Queue nonBlockingQueue() {
+ return QueueBuilder.nonDurable("non-blocking-queue")
+ .build();
+ }
+
+ @Bean
+ public Queue retryWaitEndedQueue() {
+ return QueueBuilder.nonDurable("retry-wait-ended-queue")
+ .build();
+ }
+
+ @Bean
+ public Queue retryQueue1() {
+ return QueueBuilder.nonDurable("retry-queue-1")
+ .deadLetterExchange("")
+ .deadLetterRoutingKey("retry-wait-ended-queue")
+ .build();
+ }
+
+ @Bean
+ public Queue retryQueue2() {
+ return QueueBuilder.nonDurable("retry-queue-2")
+ .deadLetterExchange("")
+ .deadLetterRoutingKey("retry-wait-ended-queue")
+ .build();
+ }
+
+ @Bean
+ public Queue retryQueue3() {
+ return QueueBuilder.nonDurable("retry-queue-3")
+ .deadLetterExchange("")
+ .deadLetterRoutingKey("retry-wait-ended-queue")
+ .build();
+ }
+
+ @Bean
+ public RetryQueues retryQueues() {
+ return new RetryQueues(1000, 3.0, 10000, retryQueue1(), retryQueue2(), retryQueue3());
+ }
+
+ @Bean
+ public ObservableRejectAndDontRequeueRecoverer observableRecoverer() {
+ return new ObservableRejectAndDontRequeueRecoverer();
+ }
+
+ @Bean
+ public RetryOperationsInterceptor retryInterceptor() {
+ return RetryInterceptorBuilder.stateless()
+ .backOffOptions(1000, 3.0, 10000)
+ .maxAttempts(5)
+ .recoverer(observableRecoverer())
+ .build();
+ }
+
+ @Bean
+ public RetryQueuesInterceptor retryQueuesInterceptor(RabbitTemplate rabbitTemplate, RetryQueues retryQueues) {
+ return new RetryQueuesInterceptor(rabbitTemplate, retryQueues);
+ }
+
+ @Bean
+ public SimpleRabbitListenerContainerFactory defaultContainerFactory(ConnectionFactory connectionFactory) {
+ SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
+ factory.setConnectionFactory(connectionFactory);
+
+ return factory;
+ }
+
+ @Bean
+ public SimpleRabbitListenerContainerFactory retryContainerFactory(ConnectionFactory connectionFactory, RetryOperationsInterceptor retryInterceptor) {
+ SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
+ factory.setConnectionFactory(connectionFactory);
+
+ Advice[] adviceChain = { retryInterceptor };
+ factory.setAdviceChain(adviceChain);
+
+ return factory;
+ }
+
+ @Bean
+ public SimpleRabbitListenerContainerFactory retryQueuesContainerFactory(ConnectionFactory connectionFactory, RetryQueuesInterceptor retryInterceptor) {
+ SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
+ factory.setConnectionFactory(connectionFactory);
+
+ Advice[] adviceChain = { retryInterceptor };
+ factory.setAdviceChain(adviceChain);
+
+ return factory;
+ }
+
+ @RabbitListener(queues = "blocking-queue", containerFactory = "retryContainerFactory")
+ public void consumeBlocking(String payload) throws Exception {
+ logger.info("Processing message from blocking-queue: {}", payload);
+
+ throw new Exception("exception occured!");
+ }
+
+ @RabbitListener(queues = "non-blocking-queue", containerFactory = "retryQueuesContainerFactory", ackMode = "MANUAL")
+ public void consumeNonBlocking(String payload) throws Exception {
+ logger.info("Processing message from non-blocking-queue: {}", payload);
+
+ throw new Exception("Error occured!");
+ }
+
+ @RabbitListener(queues = "retry-wait-ended-queue", containerFactory = "defaultContainerFactory")
+ public void consumeRetryWaitEndedMessage(String payload, Message message, Channel channel) throws Exception {
+ MessageProperties props = message.getMessageProperties();
+
+ rabbitTemplate().convertAndSend(props.getHeader("x-original-exchange"), props.getHeader("x-original-routing-key"), message);
+ }
+}
diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/RetryQueues.java b/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/RetryQueues.java
new file mode 100644
index 0000000000..f52415b3e6
--- /dev/null
+++ b/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/RetryQueues.java
@@ -0,0 +1,34 @@
+package com.baeldung.springamqp.exponentialbackoff;
+
+import org.springframework.amqp.core.Queue;
+
+public class RetryQueues {
+ private Queue[] queues;
+ private long initialInterval;
+ private double factor;
+ private long maxWait;
+
+ public RetryQueues(long initialInterval, double factor, long maxWait, Queue... queues) {
+ this.queues = queues;
+ this.initialInterval = initialInterval;
+ this.factor = factor;
+ this.maxWait = maxWait;
+ }
+
+ public boolean retriesExhausted(int retry) {
+ return retry >= queues.length;
+ }
+
+ public String getQueueName(int retry) {
+ return queues[retry].getName();
+ }
+
+ public long getTimeToWait(int retry) {
+ double time = initialInterval * Math.pow(factor, (double) retry);
+ if (time > maxWait) {
+ return maxWait;
+ }
+
+ return (long) time;
+ }
+}
\ No newline at end of file
diff --git a/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/RetryQueuesInterceptor.java b/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/RetryQueuesInterceptor.java
new file mode 100644
index 0000000000..f09a71df7c
--- /dev/null
+++ b/spring-amqp/src/main/java/com/baeldung/springamqp/exponentialbackoff/RetryQueuesInterceptor.java
@@ -0,0 +1,109 @@
+package com.baeldung.springamqp.exponentialbackoff;
+
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+
+import com.rabbitmq.client.Channel;
+
+import org.aopalliance.intercept.MethodInterceptor;
+import org.aopalliance.intercept.MethodInvocation;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.core.MessageProperties;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+
+public class RetryQueuesInterceptor implements MethodInterceptor {
+
+ private RabbitTemplate rabbitTemplate;
+
+ private RetryQueues retryQueues;
+
+ private Runnable observer;
+
+ public RetryQueuesInterceptor(RabbitTemplate rabbitTemplate, RetryQueues retryQueues) {
+ this.rabbitTemplate = rabbitTemplate;
+ this.retryQueues = retryQueues;
+ }
+
+ @Override
+ public Object invoke(MethodInvocation invocation) throws Throwable {
+ return tryConsume(invocation, this::ack, (mac, e) -> {
+ try {
+ int retryCount = tryGetRetryCountOrFail(mac, e);
+ sendToNextRetryQueue(mac, retryCount);
+ } catch (Throwable t) {
+ if (observer != null) {
+ observer.run();
+ }
+
+ throw new RuntimeException(t);
+ }
+ });
+ }
+
+ void setObserver(Runnable observer) {
+ this.observer = observer;
+ }
+
+ private Object tryConsume(MethodInvocation invocation, Consumer successHandler, BiConsumer errorHandler) throws Throwable {
+ MessageAndChannel mac = new MessageAndChannel((Message) invocation.getArguments()[1], (Channel) invocation.getArguments()[0]);
+ Object ret = null;
+ try {
+ ret = invocation.proceed();
+ successHandler.accept(mac);
+ } catch (Throwable e) {
+ errorHandler.accept(mac, e);
+ }
+ return ret;
+ }
+
+ private void ack(MessageAndChannel mac) {
+ try {
+ mac.channel.basicAck(mac.message.getMessageProperties()
+ .getDeliveryTag(), false);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private int tryGetRetryCountOrFail(MessageAndChannel mac, Throwable originalError) throws Throwable {
+ MessageProperties props = mac.message.getMessageProperties();
+
+ String xRetriedCountHeader = (String) props.getHeader("x-retried-count");
+ final int xRetriedCount = xRetriedCountHeader == null ? 0 : Integer.valueOf(xRetriedCountHeader);
+
+ if (retryQueues.retriesExhausted(xRetriedCount)) {
+ mac.channel.basicReject(props.getDeliveryTag(), false);
+
+ throw originalError;
+ }
+
+ return xRetriedCount;
+ }
+
+ private void sendToNextRetryQueue(MessageAndChannel mac, int retryCount) throws Exception {
+ String retryQueueName = retryQueues.getQueueName(retryCount);
+
+ rabbitTemplate.convertAndSend(retryQueueName, mac.message, m -> {
+ MessageProperties props = m.getMessageProperties();
+ props.setExpiration(String.valueOf(retryQueues.getTimeToWait(retryCount)));
+ props.setHeader("x-retried-count", String.valueOf(retryCount + 1));
+ props.setHeader("x-original-exchange", props.getReceivedExchange());
+ props.setHeader("x-original-routing-key", props.getReceivedRoutingKey());
+
+ return m;
+ });
+
+ mac.channel.basicReject(mac.message.getMessageProperties()
+ .getDeliveryTag(), false);
+ }
+
+ private class MessageAndChannel {
+ private Message message;
+ private Channel channel;
+
+ private MessageAndChannel(Message message, Channel channel) {
+ this.message = message;
+ this.channel = channel;
+ }
+ }
+}
\ No newline at end of file
diff --git a/spring-amqp/src/test/java/com/baeldung/springamqp/exponentialbackoff/ExponentialBackoffLiveTest.java b/spring-amqp/src/test/java/com/baeldung/springamqp/exponentialbackoff/ExponentialBackoffLiveTest.java
new file mode 100644
index 0000000000..04bd463a72
--- /dev/null
+++ b/spring-amqp/src/test/java/com/baeldung/springamqp/exponentialbackoff/ExponentialBackoffLiveTest.java
@@ -0,0 +1,58 @@
+package com.baeldung.springamqp.exponentialbackoff;
+
+import java.util.concurrent.CountDownLatch;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+/**
+ * This live test requires:
+ *
+ * - A running RabbitMQ instance on localhost (e.g. docker run -p 5672:5672 -p 15672:15672 --name rabbit rabbitmq:3-management)
+ *
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = { RabbitConfiguration.class })
+public class ExponentialBackoffLiveTest {
+
+ @Autowired
+ private RabbitTemplate rabbitTemplate;
+
+ @Autowired
+ private ObservableRejectAndDontRequeueRecoverer observableRecoverer;
+
+ @Autowired
+ private RetryQueuesInterceptor retryQueues;
+
+ @Test
+ public void whenSendToBlockingQueue_thenAllMessagesProcessed() throws Exception {
+ int nb = 2;
+
+ CountDownLatch latch = new CountDownLatch(nb);
+ observableRecoverer.setObserver(() -> latch.countDown());
+
+ for (int i = 1; i <= nb; i++) {
+ rabbitTemplate.convertAndSend("blocking-queue", "blocking message " + i);
+ }
+
+ latch.await();
+ }
+
+ @Test
+ public void whenSendToNonBlockingQueue_thenAllMessageProcessed() throws Exception {
+ int nb = 2;
+
+ CountDownLatch latch = new CountDownLatch(nb);
+ retryQueues.setObserver(() -> latch.countDown());
+
+ for (int i = 1; i <= nb; i++) {
+ rabbitTemplate.convertAndSend("non-blocking-queue", "non-blocking message " + i);
+ }
+
+ latch.await();
+ }
+}
diff --git a/spring-amqp/src/test/resources/logback-test.xml b/spring-amqp/src/test/resources/logback-test.xml
new file mode 100644
index 0000000000..7eba9aea8b
--- /dev/null
+++ b/spring-amqp/src/test/resources/logback-test.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/spring-batch/src/main/java/org/baeldung/batch/App.java b/spring-batch/src/main/java/org/baeldung/batch/App.java
index 91b99ba571..764ef72a35 100644
--- a/spring-batch/src/main/java/org/baeldung/batch/App.java
+++ b/spring-batch/src/main/java/org/baeldung/batch/App.java
@@ -18,6 +18,8 @@ public class App {
final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(SpringConfig.class);
context.register(SpringBatchConfig.class);
+ context.register(SpringBatchRetryConfig.class);
+
context.refresh();
// Spring xml config
@@ -26,6 +28,8 @@ public class App {
runJob(context, "firstBatchJob");
runJob(context, "skippingBatchJob");
runJob(context, "skipPolicyBatchJob");
+ runJob(context, "retryBatchJob");
+
}
private static void runJob(AnnotationConfigApplicationContext context, String batchJobName) {
diff --git a/spring-batch/src/main/java/org/baeldung/batch/SpringBatchRetryConfig.java b/spring-batch/src/main/java/org/baeldung/batch/SpringBatchRetryConfig.java
new file mode 100644
index 0000000000..56088f194b
--- /dev/null
+++ b/spring-batch/src/main/java/org/baeldung/batch/SpringBatchRetryConfig.java
@@ -0,0 +1,117 @@
+package org.baeldung.batch;
+
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.conn.ConnectTimeoutException;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.baeldung.batch.model.Transaction;
+import org.baeldung.batch.service.RecordFieldSetMapper;
+import org.baeldung.batch.service.RetryItemProcessor;
+import org.springframework.batch.core.Job;
+import org.springframework.batch.core.Step;
+import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
+import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
+import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
+import org.springframework.batch.item.ItemProcessor;
+import org.springframework.batch.item.ItemReader;
+import org.springframework.batch.item.ItemWriter;
+import org.springframework.batch.item.file.FlatFileItemReader;
+import org.springframework.batch.item.file.mapping.DefaultLineMapper;
+import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
+import org.springframework.batch.item.xml.StaxEventItemWriter;
+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.core.io.Resource;
+import org.springframework.dao.DeadlockLoserDataAccessException;
+import org.springframework.oxm.Marshaller;
+import org.springframework.oxm.jaxb.Jaxb2Marshaller;
+
+import java.text.ParseException;
+
+@Configuration
+@EnableBatchProcessing
+public class SpringBatchRetryConfig {
+
+ private static final String[] tokens = { "username", "userid", "transactiondate", "amount" };
+ private static final int TWO_SECONDS = 2000;
+
+ @Autowired
+ private JobBuilderFactory jobBuilderFactory;
+
+ @Autowired
+ private StepBuilderFactory stepBuilderFactory;
+
+ @Value("input/recordRetry.csv")
+ private Resource inputCsv;
+
+ @Value("file:xml/retryOutput.xml")
+ private Resource outputXml;
+
+ public ItemReader itemReader(Resource inputData) throws ParseException {
+ DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
+ tokenizer.setNames(tokens);
+ DefaultLineMapper lineMapper = new DefaultLineMapper<>();
+ lineMapper.setLineTokenizer(tokenizer);
+ lineMapper.setFieldSetMapper(new RecordFieldSetMapper());
+ FlatFileItemReader reader = new FlatFileItemReader<>();
+ reader.setResource(inputData);
+ reader.setLinesToSkip(1);
+ reader.setLineMapper(lineMapper);
+ return reader;
+ }
+
+ @Bean
+ public CloseableHttpClient closeableHttpClient() {
+ final RequestConfig config = RequestConfig.custom()
+ .setConnectTimeout(TWO_SECONDS)
+ .build();
+ return HttpClientBuilder.create().setDefaultRequestConfig(config).build();
+ }
+
+ @Bean
+ public ItemProcessor retryItemProcessor() {
+ return new RetryItemProcessor();
+ }
+
+ @Bean
+ public ItemWriter itemWriter(Marshaller marshaller) {
+ StaxEventItemWriter itemWriter = new StaxEventItemWriter<>();
+ itemWriter.setMarshaller(marshaller);
+ itemWriter.setRootTagName("transactionRecord");
+ itemWriter.setResource(outputXml);
+ return itemWriter;
+ }
+
+ @Bean
+ public Marshaller marshaller() {
+ Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
+ marshaller.setClassesToBeBound(Transaction.class);
+ return marshaller;
+ }
+
+ @Bean
+ public Step retryStep(@Qualifier("retryItemProcessor") ItemProcessor processor,
+ ItemWriter writer) throws ParseException {
+ return stepBuilderFactory.get("retryStep")
+ .chunk(10)
+ .reader(itemReader(inputCsv))
+ .processor(processor)
+ .writer(writer)
+ .faultTolerant()
+ .retryLimit(3)
+ .retry(ConnectTimeoutException.class)
+ .retry(DeadlockLoserDataAccessException.class)
+ .build();
+ }
+
+ @Bean(name = "retryBatchJob")
+ public Job retryJob(@Qualifier("retryStep") Step retryStep) {
+ return jobBuilderFactory
+ .get("retryBatchJob")
+ .start(retryStep)
+ .build();
+ }
+}
diff --git a/spring-batch/src/main/java/org/baeldung/batch/model/Transaction.java b/spring-batch/src/main/java/org/baeldung/batch/model/Transaction.java
index 0ce3a413ab..8ed1d29e3b 100644
--- a/spring-batch/src/main/java/org/baeldung/batch/model/Transaction.java
+++ b/spring-batch/src/main/java/org/baeldung/batch/model/Transaction.java
@@ -1,15 +1,19 @@
package org.baeldung.batch.model;
-import java.util.Date;
+import org.baeldung.batch.service.adapter.LocalDateTimeAdapter;
import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import java.time.LocalDateTime;
@SuppressWarnings("restriction")
@XmlRootElement(name = "transactionRecord")
public class Transaction {
private String username;
private int userId;
- private Date transactionDate;
+ private int age;
+ private String postCode;
+ private LocalDateTime transactionDate;
private double amount;
/* getters and setters for the attributes */
@@ -30,11 +34,12 @@ public class Transaction {
this.userId = userId;
}
- public Date getTransactionDate() {
+ @XmlJavaTypeAdapter(LocalDateTimeAdapter.class)
+ public LocalDateTime getTransactionDate() {
return transactionDate;
}
- public void setTransactionDate(Date transactionDate) {
+ public void setTransactionDate(LocalDateTime transactionDate) {
this.transactionDate = transactionDate;
}
@@ -46,9 +51,25 @@ public class Transaction {
this.amount = amount;
}
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ public String getPostCode() {
+ return postCode;
+ }
+
+ public void setPostCode(String postCode) {
+ this.postCode = postCode;
+ }
+
@Override
public String toString() {
- return "Transaction [username=" + username + ", userId=" + userId + ", transactionDate=" + transactionDate + ", amount=" + amount + "]";
+ return "Transaction [username=" + username + ", userId=" + userId + ", age=" + age + ", postCode=" + postCode + ", transactionDate=" + transactionDate + ", amount=" + amount + "]";
}
}
diff --git a/spring-batch/src/main/java/org/baeldung/batch/service/RecordFieldSetMapper.java b/spring-batch/src/main/java/org/baeldung/batch/service/RecordFieldSetMapper.java
index fa6f0870aa..e61c54193a 100644
--- a/spring-batch/src/main/java/org/baeldung/batch/service/RecordFieldSetMapper.java
+++ b/spring-batch/src/main/java/org/baeldung/batch/service/RecordFieldSetMapper.java
@@ -1,18 +1,19 @@
package org.baeldung.batch.service;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-
import org.baeldung.batch.model.Transaction;
import org.springframework.batch.item.file.mapping.FieldSetMapper;
import org.springframework.batch.item.file.transform.FieldSet;
import org.springframework.validation.BindException;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+
public class RecordFieldSetMapper implements FieldSetMapper {
public Transaction mapFieldSet(FieldSet fieldSet) throws BindException {
- SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/M/yyy");
+
Transaction transaction = new Transaction();
// you can either use the indices or custom names
// I personally prefer the custom names easy for debugging and
@@ -20,13 +21,10 @@ public class RecordFieldSetMapper implements FieldSetMapper {
transaction.setUsername(fieldSet.readString("username"));
transaction.setUserId(fieldSet.readInt("userid"));
transaction.setAmount(fieldSet.readDouble(3));
+
// Converting the date
String dateString = fieldSet.readString(2);
- try {
- transaction.setTransactionDate(dateFormat.parse(dateString));
- } catch (ParseException e) {
- e.printStackTrace();
- }
+ transaction.setTransactionDate(LocalDate.parse(dateString, formatter).atStartOfDay());
return transaction;
diff --git a/spring-batch/src/main/java/org/baeldung/batch/service/RetryItemProcessor.java b/spring-batch/src/main/java/org/baeldung/batch/service/RetryItemProcessor.java
new file mode 100644
index 0000000000..d4e82452a7
--- /dev/null
+++ b/spring-batch/src/main/java/org/baeldung/batch/service/RetryItemProcessor.java
@@ -0,0 +1,42 @@
+package org.baeldung.batch.service;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.util.EntityUtils;
+import org.baeldung.batch.model.Transaction;
+import org.codehaus.jettison.json.JSONException;
+import org.codehaus.jettison.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.batch.item.ItemProcessor;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.io.IOException;
+
+public class RetryItemProcessor implements ItemProcessor {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(RetryItemProcessor.class);
+
+ @Autowired
+ private CloseableHttpClient closeableHttpClient;
+
+ @Override
+ public Transaction process(Transaction transaction) throws IOException, JSONException {
+ LOGGER.info("Attempting to process user with id={}", transaction.getUserId());
+ HttpResponse response = fetchMoreUserDetails(transaction.getUserId());
+
+ //parse user's age and postCode from response and update transaction
+ String result = EntityUtils.toString(response.getEntity());
+ JSONObject userObject = new JSONObject(result);
+ transaction.setAge(Integer.parseInt(userObject.getString("age")));
+ transaction.setPostCode(userObject.getString("postCode"));
+
+ return transaction;
+ }
+
+ private HttpResponse fetchMoreUserDetails(int id) throws IOException {
+ final HttpGet request = new HttpGet("http://www.baeldung.com:81/user/" + id);
+ return closeableHttpClient.execute(request);
+ }
+}
diff --git a/spring-batch/src/main/java/org/baeldung/batch/service/adapter/LocalDateTimeAdapter.java b/spring-batch/src/main/java/org/baeldung/batch/service/adapter/LocalDateTimeAdapter.java
new file mode 100644
index 0000000000..45c35b87f1
--- /dev/null
+++ b/spring-batch/src/main/java/org/baeldung/batch/service/adapter/LocalDateTimeAdapter.java
@@ -0,0 +1,19 @@
+package org.baeldung.batch.service.adapter;
+
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+public class LocalDateTimeAdapter extends XmlAdapter {
+
+ private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
+ private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern(DATE_FORMAT);
+
+ public LocalDateTime unmarshal(String v) throws Exception {
+ return LocalDateTime.parse(v, DATE_TIME_FORMATTER);
+ }
+
+ public String marshal(LocalDateTime v) throws Exception {
+ return DATE_TIME_FORMATTER.format(v);
+ }
+}
\ No newline at end of file
diff --git a/spring-batch/src/main/resources/input/recordRetry.csv b/spring-batch/src/main/resources/input/recordRetry.csv
new file mode 100644
index 0000000000..1b1e3e1ac9
--- /dev/null
+++ b/spring-batch/src/main/resources/input/recordRetry.csv
@@ -0,0 +1,3 @@
+username, user_id, transaction_date, transaction_amount
+sammy, 1234, 31/10/2015, 10000
+john, 9999, 3/12/2015, 12321
diff --git a/spring-batch/src/main/resources/output/output1.xml b/spring-batch/src/main/resources/output/output1.xml
index 194b860813..838d04882a 100644
--- a/spring-batch/src/main/resources/output/output1.xml
+++ b/spring-batch/src/main/resources/output/output1.xml
@@ -2,19 +2,19 @@
10000.0
- 2015-10-31T00:00:00+05:30
+ 2015-10-31 00:00:001234devendra12321.0
- 2015-12-03T00:00:00+05:30
+ 2015-12-03 00:00:002134john23411.0
- 2015-02-02T00:00:00+05:30
+ 2015-02-02 00:00:002134robin
diff --git a/spring-batch/src/main/resources/output/output2.xml b/spring-batch/src/main/resources/output/output2.xml
index 194b860813..838d04882a 100644
--- a/spring-batch/src/main/resources/output/output2.xml
+++ b/spring-batch/src/main/resources/output/output2.xml
@@ -2,19 +2,19 @@
10000.0
- 2015-10-31T00:00:00+05:30
+ 2015-10-31 00:00:001234devendra12321.0
- 2015-12-03T00:00:00+05:30
+ 2015-12-03 00:00:002134john23411.0
- 2015-02-02T00:00:00+05:30
+ 2015-02-02 00:00:002134robin
diff --git a/spring-batch/src/main/resources/output/output3.xml b/spring-batch/src/main/resources/output/output3.xml
index 194b860813..838d04882a 100644
--- a/spring-batch/src/main/resources/output/output3.xml
+++ b/spring-batch/src/main/resources/output/output3.xml
@@ -2,19 +2,19 @@
10000.0
- 2015-10-31T00:00:00+05:30
+ 2015-10-31 00:00:001234devendra12321.0
- 2015-12-03T00:00:00+05:30
+ 2015-12-03 00:00:002134john23411.0
- 2015-02-02T00:00:00+05:30
+ 2015-02-02 00:00:002134robin
diff --git a/spring-batch/src/main/resources/output/output4.xml b/spring-batch/src/main/resources/output/output4.xml
index 194b860813..838d04882a 100644
--- a/spring-batch/src/main/resources/output/output4.xml
+++ b/spring-batch/src/main/resources/output/output4.xml
@@ -2,19 +2,19 @@
10000.0
- 2015-10-31T00:00:00+05:30
+ 2015-10-31 00:00:001234devendra12321.0
- 2015-12-03T00:00:00+05:30
+ 2015-12-03 00:00:002134john23411.0
- 2015-02-02T00:00:00+05:30
+ 2015-02-02 00:00:002134robin
diff --git a/spring-batch/src/main/resources/output/output5.xml b/spring-batch/src/main/resources/output/output5.xml
index 194b860813..838d04882a 100644
--- a/spring-batch/src/main/resources/output/output5.xml
+++ b/spring-batch/src/main/resources/output/output5.xml
@@ -2,19 +2,19 @@
10000.0
- 2015-10-31T00:00:00+05:30
+ 2015-10-31 00:00:001234devendra12321.0
- 2015-12-03T00:00:00+05:30
+ 2015-12-03 00:00:002134john23411.0
- 2015-02-02T00:00:00+05:30
+ 2015-02-02 00:00:002134robin
diff --git a/spring-batch/src/main/resources/spring-batch-intro.xml b/spring-batch/src/main/resources/spring-batch-intro.xml
index 0f76dd50ff..908b8aa2e1 100644
--- a/spring-batch/src/main/resources/spring-batch-intro.xml
+++ b/spring-batch/src/main/resources/spring-batch-intro.xml
@@ -54,4 +54,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-batch/src/test/java/org/baeldung/batch/SpringBatchRetryIntegrationTest.java b/spring-batch/src/test/java/org/baeldung/batch/SpringBatchRetryIntegrationTest.java
new file mode 100644
index 0000000000..293c97ac5d
--- /dev/null
+++ b/spring-batch/src/test/java/org/baeldung/batch/SpringBatchRetryIntegrationTest.java
@@ -0,0 +1,90 @@
+package org.baeldung.batch;
+
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.conn.ConnectTimeoutException;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.springframework.batch.core.ExitStatus;
+import org.springframework.batch.core.JobExecution;
+import org.springframework.batch.core.JobInstance;
+import org.springframework.batch.core.JobParameters;
+import org.springframework.batch.core.JobParametersBuilder;
+import org.springframework.batch.test.AssertFile;
+import org.springframework.batch.test.JobLauncherTestUtils;
+import org.springframework.batch.test.context.SpringBatchTest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+@RunWith(SpringRunner.class)
+@SpringBatchTest
+@EnableAutoConfiguration
+@ContextConfiguration(classes = { SpringBatchRetryConfig.class })
+public class SpringBatchRetryIntegrationTest {
+
+ private static final String TEST_OUTPUT = "xml/retryOutput.xml";
+ private static final String EXPECTED_OUTPUT = "src/test/resources/output/batchRetry/retryOutput.xml";
+
+ @Autowired
+ private JobLauncherTestUtils jobLauncherTestUtils;
+
+ @MockBean
+ private CloseableHttpClient closeableHttpClient;
+
+ @Mock
+ private CloseableHttpResponse httpResponse;
+
+ @Test
+ public void whenEndpointAlwaysFail_thenJobFails() throws Exception {
+ when(closeableHttpClient.execute(any()))
+ .thenThrow(new ConnectTimeoutException("Endpoint is down"));
+
+ JobExecution jobExecution = jobLauncherTestUtils.launchJob(defaultJobParameters());
+ JobInstance actualJobInstance = jobExecution.getJobInstance();
+ ExitStatus actualJobExitStatus = jobExecution.getExitStatus();
+
+ assertThat(actualJobInstance.getJobName(), is("retryBatchJob"));
+ assertThat(actualJobExitStatus.getExitCode(), is("FAILED"));
+ assertThat(actualJobExitStatus.getExitDescription(), containsString("org.apache.http.conn.ConnectTimeoutException"));
+ }
+
+ @Test
+ public void whenEndpointFailsTwicePasses3rdTime_thenSuccess() throws Exception {
+ FileSystemResource expectedResult = new FileSystemResource(EXPECTED_OUTPUT);
+ FileSystemResource actualResult = new FileSystemResource(TEST_OUTPUT);
+
+ //fails for first two calls and passes third time onwards
+ when(httpResponse.getEntity())
+ .thenReturn(new StringEntity("{ \"age\":10, \"postCode\":\"430222\" }"));
+ when(closeableHttpClient.execute(any()))
+ .thenThrow(new ConnectTimeoutException("Timeout count 1"))
+ .thenThrow(new ConnectTimeoutException("Timeout count 2"))
+ .thenReturn(httpResponse);
+
+ JobExecution jobExecution = jobLauncherTestUtils.launchJob(defaultJobParameters());
+ JobInstance actualJobInstance = jobExecution.getJobInstance();
+ ExitStatus actualJobExitStatus = jobExecution.getExitStatus();
+
+ assertThat(actualJobInstance.getJobName(), is("retryBatchJob"));
+ assertThat(actualJobExitStatus.getExitCode(), is("COMPLETED"));
+ AssertFile.assertFileEquals(expectedResult, actualResult);
+ }
+
+ private JobParameters defaultJobParameters() {
+ JobParametersBuilder paramsBuilder = new JobParametersBuilder();
+ paramsBuilder.addString("jobID", String.valueOf(System.currentTimeMillis()));
+ return paramsBuilder.toJobParameters();
+ }
+}
diff --git a/spring-batch/src/test/resources/output/batchRetry/retryOutput.xml b/spring-batch/src/test/resources/output/batchRetry/retryOutput.xml
new file mode 100644
index 0000000000..4cc8db7542
--- /dev/null
+++ b/spring-batch/src/test/resources/output/batchRetry/retryOutput.xml
@@ -0,0 +1 @@
+1010000.04302222015-10-31 00:00:001234sammy1012321.04302222015-12-03 00:00:009999john
diff --git a/spring-batch/xml/output.xml b/spring-batch/xml/output.xml
index acf4969341..d2bed5fcd3 100644
--- a/spring-batch/xml/output.xml
+++ b/spring-batch/xml/output.xml
@@ -1 +1 @@
-10000.02015-10-31T00:00:00+05:301234devendra12321.02015-12-03T00:00:00+05:302134john23411.02015-02-02T00:00:00+05:302134robin
\ No newline at end of file
+10000.02015-10-31 00:00:001234devendra12321.02015-12-03 00:00:002134john23411.02015-02-02 00:00:002134robin
\ No newline at end of file
diff --git a/spring-batch/xml/retryOutput.xml b/spring-batch/xml/retryOutput.xml
new file mode 100644
index 0000000000..d30f2c4a32
--- /dev/null
+++ b/spring-batch/xml/retryOutput.xml
@@ -0,0 +1 @@
+1010000.04302222015-10-31 00:00:001234sammy1012321.04302222015-12-03 00:00:009999john
\ No newline at end of file
diff --git a/spring-boot-modules/README.md b/spring-boot-modules/README.md
deleted file mode 100644
index cd916f48a7..0000000000
--- a/spring-boot-modules/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-## Spring Boot Modules
-
-This module contains various modules of Spring Boot
diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml
index 0918aa9496..c8d153d4bb 100644
--- a/spring-boot-modules/pom.xml
+++ b/spring-boot-modules/pom.xml
@@ -17,6 +17,7 @@
spring-bootspring-boot-adminspring-boot-angular
+ spring-boot-annotationsspring-boot-artifactsspring-boot-autoconfigurationspring-boot-bootstrap
@@ -31,6 +32,7 @@
spring-boot-crudspring-boot-dataspring-boot-environment
+ spring-boot-exceptionsspring-boot-flowablespring-boot-jasypt
@@ -42,6 +44,7 @@
spring-boot-mvc-2spring-boot-mvc-birtspring-boot-nashorn
+ spring-boot-parentspring-boot-performancespring-boot-propertiesspring-boot-property-exp
diff --git a/spring-boot-modules/spring-boot-annotations/README.md b/spring-boot-modules/spring-boot-annotations/README.md
new file mode 100644
index 0000000000..a721f28d55
--- /dev/null
+++ b/spring-boot-modules/spring-boot-annotations/README.md
@@ -0,0 +1,11 @@
+## Spring Boot Annotations
+
+This module contains articles about Spring Boot annotations
+
+### Relevant Articles:
+
+- [Spring Boot Annotations](https://www.baeldung.com/spring-boot-annotations)
+- [Spring Scheduling Annotations](https://www.baeldung.com/spring-scheduling-annotations)
+- [Spring Web Annotations](https://www.baeldung.com/spring-mvc-annotations)
+- [Spring Core Annotations](https://www.baeldung.com/spring-core-annotations)
+- [Spring Bean Annotations](https://www.baeldung.com/spring-bean-annotations)
diff --git a/spring-boot-modules/spring-boot-annotations/pom.xml b/spring-boot-modules/spring-boot-annotations/pom.xml
new file mode 100644
index 0000000000..9ad63214ef
--- /dev/null
+++ b/spring-boot-modules/spring-boot-annotations/pom.xml
@@ -0,0 +1,35 @@
+
+
+ 4.0.0
+ spring-boot-annotations
+ spring-boot-annotations
+ war
+
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-2
+
+
+
+
+ org.aspectj
+ aspectjweaver
+ 1.9.1
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/Bike.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/Bike.java
similarity index 100%
rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/Bike.java
rename to spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/Bike.java
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/Biker.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/Biker.java
similarity index 100%
rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/Biker.java
rename to spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/Biker.java
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/Car.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/Car.java
similarity index 100%
rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/Car.java
rename to spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/Car.java
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/CarMechanic.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/CarMechanic.java
similarity index 100%
rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/CarMechanic.java
rename to spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/CarMechanic.java
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/CarUtility.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/CarUtility.java
similarity index 100%
rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/CarUtility.java
rename to spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/CarUtility.java
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/CustomException.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/CustomException.java
similarity index 100%
rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/CustomException.java
rename to spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/CustomException.java
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/Driver.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/Driver.java
similarity index 100%
rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/Driver.java
rename to spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/Driver.java
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/Engine.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/Engine.java
similarity index 100%
rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/Engine.java
rename to spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/Engine.java
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/PerformanceAspect.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/PerformanceAspect.java
similarity index 100%
rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/PerformanceAspect.java
rename to spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/PerformanceAspect.java
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/Vehicle.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/Vehicle.java
similarity index 100%
rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/Vehicle.java
rename to spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/Vehicle.java
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/VehicleController.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/VehicleController.java
similarity index 100%
rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/VehicleController.java
rename to spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/VehicleController.java
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/VehicleFactoryApplication.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/VehicleFactoryApplication.java
similarity index 100%
rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/VehicleFactoryApplication.java
rename to spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/VehicleFactoryApplication.java
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/VehicleFactoryConfig.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/VehicleFactoryConfig.java
similarity index 100%
rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/VehicleFactoryConfig.java
rename to spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/VehicleFactoryConfig.java
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/VehicleRepository.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/VehicleRepository.java
similarity index 100%
rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/VehicleRepository.java
rename to spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/VehicleRepository.java
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/VehicleRestController.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/VehicleRestController.java
similarity index 100%
rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/VehicleRestController.java
rename to spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/VehicleRestController.java
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/VehicleService.java b/spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/VehicleService.java
similarity index 100%
rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/annotations/VehicleService.java
rename to spring-boot-modules/spring-boot-annotations/src/main/java/com/baeldung/annotations/VehicleService.java
diff --git a/spring-boot-modules/spring-boot-exceptions/README.MD b/spring-boot-modules/spring-boot-exceptions/README.MD
new file mode 100644
index 0000000000..33ae193fb8
--- /dev/null
+++ b/spring-boot-modules/spring-boot-exceptions/README.MD
@@ -0,0 +1,7 @@
+## Spring Boot
+
+This module contains articles about Spring Boot Exceptions
+
+### Relevant Articles:
+
+- [The BeanDefinitionOverrideException in Spring Boot](https://www.baeldung.com/spring-boot-bean-definition-override-exception)
diff --git a/spring-boot-modules/spring-boot-exceptions/pom.xml b/spring-boot-modules/spring-boot-exceptions/pom.xml
new file mode 100644
index 0000000000..f69beccf5d
--- /dev/null
+++ b/spring-boot-modules/spring-boot-exceptions/pom.xml
@@ -0,0 +1,96 @@
+
+
+ 4.0.0
+ spring-boot-exceptions
+ spring-boot-exceptions
+ jar
+ Demo project for working with Spring Boot exceptions
+
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-2
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+ 2.2.3.RELEASE
+
+
+
+
+ spring-boot-exceptions
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-war-plugin
+
+
+
+ org.apache.maven.plugins
+ maven-resources-plugin
+
+
+ @
+
+ false
+
+
+
+
+
+
+
+
+ autoconfiguration
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ integration-test
+
+ test
+
+
+
+ **/*LiveTest.java
+ **/*IntegrationTest.java
+ **/*IntTest.java
+
+
+ **/AutoconfigurationTest.java
+
+
+
+
+
+
+ json
+
+
+
+
+
+
+
+
+
+
+ com.baeldung.intro.App
+
+
diff --git a/spring-boot/src/test/java/com/baeldung/beandefinitionoverrideexception/SpringBootBeanDefinitionOverrideExceptionIntegrationTest.java b/spring-boot-modules/spring-boot-exceptions/src/test/java/com/baeldung/beandefinitionoverrideexception/SpringBootBeanDefinitionOverrideExceptionIntegrationTest.java
similarity index 100%
rename from spring-boot/src/test/java/com/baeldung/beandefinitionoverrideexception/SpringBootBeanDefinitionOverrideExceptionIntegrationTest.java
rename to spring-boot-modules/spring-boot-exceptions/src/test/java/com/baeldung/beandefinitionoverrideexception/SpringBootBeanDefinitionOverrideExceptionIntegrationTest.java
diff --git a/spring-boot/src/test/java/com/baeldung/beandefinitionoverrideexception/TestConfiguration1.java b/spring-boot-modules/spring-boot-exceptions/src/test/java/com/baeldung/beandefinitionoverrideexception/TestConfiguration1.java
similarity index 100%
rename from spring-boot/src/test/java/com/baeldung/beandefinitionoverrideexception/TestConfiguration1.java
rename to spring-boot-modules/spring-boot-exceptions/src/test/java/com/baeldung/beandefinitionoverrideexception/TestConfiguration1.java
diff --git a/spring-boot/src/test/java/com/baeldung/beandefinitionoverrideexception/TestConfiguration2.java b/spring-boot-modules/spring-boot-exceptions/src/test/java/com/baeldung/beandefinitionoverrideexception/TestConfiguration2.java
similarity index 100%
rename from spring-boot/src/test/java/com/baeldung/beandefinitionoverrideexception/TestConfiguration2.java
rename to spring-boot-modules/spring-boot-exceptions/src/test/java/com/baeldung/beandefinitionoverrideexception/TestConfiguration2.java
diff --git a/spring-boot-modules/spring-boot-exceptions/src/test/resources/application.properties b/spring-boot-modules/spring-boot-exceptions/src/test/resources/application.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/spring-boot-modules/spring-boot-exceptions/src/test/resources/logback-test.xml b/spring-boot-modules/spring-boot-exceptions/src/test/resources/logback-test.xml
new file mode 100644
index 0000000000..2398bfec50
--- /dev/null
+++ b/spring-boot-modules/spring-boot-exceptions/src/test/resources/logback-test.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-logging-log4j2/pom.xml b/spring-boot-modules/spring-boot-logging-log4j2/pom.xml
index 6e709230dd..4422405187 100644
--- a/spring-boot-modules/spring-boot-logging-log4j2/pom.xml
+++ b/spring-boot-modules/spring-boot-logging-log4j2/pom.xml
@@ -13,6 +13,7 @@
org.springframework.bootspring-boot-starter-parent2.2.2.RELEASE
+
diff --git a/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/swagger2boot/config/Swagger2Config.java b/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/swagger2boot/config/Swagger2Config.java
index a0048eb505..6f3557d597 100644
--- a/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/swagger2boot/config/Swagger2Config.java
+++ b/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/swagger2boot/config/Swagger2Config.java
@@ -16,11 +16,12 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
public class Swagger2Config {
@Bean
public Docket api() {
- return new Docket(DocumentationType.SWAGGER_2).select()
- .apis(RequestHandlerSelectors.basePackage("com.baeldung.swagger2boot.controller"))
- .paths(PathSelectors.regex("/.*"))
- .build()
- .apiInfo(apiEndPointsInfo());
+ return new Docket(DocumentationType.SWAGGER_2)
+ .select()
+ .apis(RequestHandlerSelectors.any())
+ .paths(PathSelectors.any())
+ .build()
+ .apiInfo(apiEndPointsInfo());
}
private ApiInfo apiEndPointsInfo() {
diff --git a/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/swagger2boot/controller/UserController.java b/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/swagger2boot/controller/UserController.java
new file mode 100644
index 0000000000..d8102a8407
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/swagger2boot/controller/UserController.java
@@ -0,0 +1,39 @@
+package com.baeldung.swagger2boot.controller;
+
+import com.baeldung.swagger2boot.model.Foo;
+import com.baeldung.swagger2boot.model.User;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import javax.websocket.server.PathParam;
+
+import static org.apache.commons.lang3.RandomStringUtils.randomNumeric;
+
+@Controller
+public class UserController {
+
+ public UserController() {
+ super();
+ } //@formatter:off
+
+ @RequestMapping(method = RequestMethod.POST, value = "/createUser", produces = "application/json; charset=UTF-8")
+ @ResponseStatus(HttpStatus.CREATED)
+ @ResponseBody
+ @ApiOperation(value = "Create user",
+ notes = "This method creates a new user")
+ public User createUser(@ApiParam(
+ name = "firstName",
+ type = "String",
+ value = "First Name of the user",
+ example = "Vatsal",
+ required = true) @RequestParam String firstName) { //@formatter:on
+ User user = new User(firstName);
+ return user;
+ }
+}
diff --git a/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/swagger2boot/model/User.java b/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/swagger2boot/model/User.java
new file mode 100644
index 0000000000..d4a6479f4e
--- /dev/null
+++ b/spring-boot-modules/spring-boot-mvc-2/src/main/java/com/baeldung/swagger2boot/model/User.java
@@ -0,0 +1,28 @@
+package com.baeldung.swagger2boot.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel
+public class User {
+
+ @ApiModelProperty(value = "first name of the user", name = "firstName", dataType = "String", example = "Vatsal")
+ String firstName;
+
+ public User() {
+ super();
+ }
+
+ public User(final String firstName) {
+ super();
+ this.firstName = firstName;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+}
diff --git a/spring-boot-modules/spring-boot-mvc/README.md b/spring-boot-modules/spring-boot-mvc/README.md
index a83ea3ee25..b4f87d1d40 100644
--- a/spring-boot-modules/spring-boot-mvc/README.md
+++ b/spring-boot-modules/spring-boot-mvc/README.md
@@ -6,16 +6,8 @@ This module contains articles about Spring Web MVC in Spring Boot projects.
- [Guide to the Favicon in Spring Boot](https://www.baeldung.com/spring-boot-favicon)
- [Custom Validation MessageSource in Spring Boot](https://www.baeldung.com/spring-custom-validation-message-source)
-- [Spring Boot Annotations](https://www.baeldung.com/spring-boot-annotations)
-- [Spring Scheduling Annotations](https://www.baeldung.com/spring-scheduling-annotations)
-- [Spring Web Annotations](https://www.baeldung.com/spring-mvc-annotations)
-- [Spring Core Annotations](https://www.baeldung.com/spring-core-annotations)
- [Display RSS Feed with Spring MVC](https://www.baeldung.com/spring-mvc-rss-feed)
- [A Controller, Service and DAO Example with Spring Boot and JSF](https://www.baeldung.com/jsf-spring-boot-controller-service-dao)
-- [Cache Eviction in Spring Boot](https://www.baeldung.com/spring-boot-evict-cache)
- [Setting Up Swagger 2 with a Spring REST API](https://www.baeldung.com/swagger-2-documentation-for-spring-rest-api)
-- [Conditionally Enable Scheduled Jobs in Spring](https://www.baeldung.com/spring-scheduled-enabled-conditionally)
-- [Accessing Spring MVC Model Objects in JavaScript](https://www.baeldung.com/spring-mvc-model-objects-js)
- [Using Spring ResponseEntity to Manipulate the HTTP Response](https://www.baeldung.com/spring-response-entity)
-- [Spring Bean Annotations](https://www.baeldung.com/spring-bean-annotations)
- More articles: [[next -->]](/spring-boot-mvc-2)
diff --git a/spring-boot-parent/README.md b/spring-boot-modules/spring-boot-parent/README.md
similarity index 100%
rename from spring-boot-parent/README.md
rename to spring-boot-modules/spring-boot-parent/README.md
diff --git a/spring-boot-parent/pom.xml b/spring-boot-modules/spring-boot-parent/pom.xml
similarity index 85%
rename from spring-boot-parent/pom.xml
rename to spring-boot-modules/spring-boot-parent/pom.xml
index 7ce5bdc428..cf0a6702ea 100644
--- a/spring-boot-parent/pom.xml
+++ b/spring-boot-modules/spring-boot-parent/pom.xml
@@ -10,10 +10,9 @@
spring-boot-parent
- com.baeldung
- parent-modules
+ com.baeldung.spring-boot-modules
+ spring-boot-modules1.0.0-SNAPSHOT
- ..
diff --git a/spring-boot-parent/spring-boot-with-custom-parent/pom.xml b/spring-boot-modules/spring-boot-parent/spring-boot-with-custom-parent/pom.xml
similarity index 93%
rename from spring-boot-parent/spring-boot-with-custom-parent/pom.xml
rename to spring-boot-modules/spring-boot-parent/spring-boot-with-custom-parent/pom.xml
index 1eb4255c7e..d08384e34c 100644
--- a/spring-boot-parent/spring-boot-with-custom-parent/pom.xml
+++ b/spring-boot-modules/spring-boot-parent/spring-boot-with-custom-parent/pom.xml
@@ -11,7 +11,7 @@
com.baeldungparent-boot-20.0.1-SNAPSHOT
- ../../parent-boot-2
+ ../../../parent-boot-2
diff --git a/spring-boot-parent/spring-boot-with-custom-parent/src/main/java/com/baeldung/customparent/SpringBootStarterCustomParentApplication.java b/spring-boot-modules/spring-boot-parent/spring-boot-with-custom-parent/src/main/java/com/baeldung/customparent/SpringBootStarterCustomParentApplication.java
similarity index 100%
rename from spring-boot-parent/spring-boot-with-custom-parent/src/main/java/com/baeldung/customparent/SpringBootStarterCustomParentApplication.java
rename to spring-boot-modules/spring-boot-parent/spring-boot-with-custom-parent/src/main/java/com/baeldung/customparent/SpringBootStarterCustomParentApplication.java
diff --git a/spring-boot-parent/spring-boot-with-starter-parent/pom.xml b/spring-boot-modules/spring-boot-parent/spring-boot-with-starter-parent/pom.xml
similarity index 96%
rename from spring-boot-parent/spring-boot-with-starter-parent/pom.xml
rename to spring-boot-modules/spring-boot-parent/spring-boot-with-starter-parent/pom.xml
index 05c61fc4cc..baba410b39 100644
--- a/spring-boot-parent/spring-boot-with-starter-parent/pom.xml
+++ b/spring-boot-modules/spring-boot-parent/spring-boot-with-starter-parent/pom.xml
@@ -12,7 +12,7 @@
com.baeldungparent-boot-20.0.1-SNAPSHOT
- ../../parent-boot-2
+ ../../../parent-boot-2
diff --git a/spring-boot-parent/spring-boot-with-starter-parent/src/main/java/com/baeldung/starterparent/SpringBootStarterParentApplication.java b/spring-boot-modules/spring-boot-parent/spring-boot-with-starter-parent/src/main/java/com/baeldung/starterparent/SpringBootStarterParentApplication.java
similarity index 100%
rename from spring-boot-parent/spring-boot-with-starter-parent/src/main/java/com/baeldung/starterparent/SpringBootStarterParentApplication.java
rename to spring-boot-modules/spring-boot-parent/spring-boot-with-starter-parent/src/main/java/com/baeldung/starterparent/SpringBootStarterParentApplication.java
diff --git a/spring-boot-modules/spring-boot-properties/pom.xml b/spring-boot-modules/spring-boot-properties/pom.xml
index 04879a5052..ec05ec1bdc 100644
--- a/spring-boot-modules/spring-boot-properties/pom.xml
+++ b/spring-boot-modules/spring-boot-properties/pom.xml
@@ -43,6 +43,12 @@
httpcore${httpcore.version}
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ ${configuration-processor.version}
+ true
+
@@ -121,6 +127,7 @@
20.04.4.11@
+ 2.2.4.RELEASE
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configuration/processor/CustomProperties.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configuration/processor/CustomProperties.java
new file mode 100644
index 0000000000..398b7557c4
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configuration/processor/CustomProperties.java
@@ -0,0 +1,37 @@
+package com.baeldung.configuration.processor;
+
+import org.springframework.boot.context.properties.*;
+import org.springframework.context.annotation.*;
+
+@Configuration
+@ConfigurationProperties(prefix = "com.baeldung")
+public class CustomProperties {
+
+ /**
+ * The url to connect to.
+ */
+ String url;
+
+ /**
+ * The time to wait for the connection.
+ */
+ private int timeoutInMilliSeconds = 1000;
+
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public int getTimeoutInMilliSeconds() {
+ return timeoutInMilliSeconds;
+ }
+
+ public void setTimeoutInMilliSeconds(int timeoutInMilliSeconds) {
+ this.timeoutInMilliSeconds = timeoutInMilliSeconds;
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configuration/processor/DemoApplication.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configuration/processor/DemoApplication.java
new file mode 100644
index 0000000000..1a35de86da
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configuration/processor/DemoApplication.java
@@ -0,0 +1,12 @@
+package com.baeldung.configuration.processor;
+
+import org.springframework.boot.*;
+import org.springframework.boot.autoconfigure.*;
+
+@SpringBootApplication
+public class DemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(DemoApplication.class, args);
+ }
+}
diff --git a/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configuration/processor/PropertyBeanInjection.java b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configuration/processor/PropertyBeanInjection.java
new file mode 100644
index 0000000000..3bcbf41f54
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/main/java/com/baeldung/configuration/processor/PropertyBeanInjection.java
@@ -0,0 +1,22 @@
+package com.baeldung.configuration.processor;
+
+import org.springframework.beans.factory.annotation.*;
+import org.springframework.stereotype.*;
+
+@Component
+public class PropertyBeanInjection {
+
+ private final CustomProperties customProperties;
+
+ PropertyBeanInjection(@Autowired CustomProperties customProperties) {
+ this.customProperties = customProperties;
+ }
+
+ String getUrl() {
+ return customProperties.getUrl();
+ }
+
+ int getTimeoutInMilliseconds() {
+ return customProperties.getTimeoutInMilliSeconds();
+ }
+}
diff --git a/spring-boot-modules/spring-boot-properties/src/main/resources/build.properties b/spring-boot-modules/spring-boot-properties/src/main/resources/build.properties
index f3d2e9b15b..5bd0a50a17 100644
--- a/spring-boot-modules/spring-boot-properties/src/main/resources/build.properties
+++ b/spring-boot-modules/spring-boot-properties/src/main/resources/build.properties
@@ -1 +1,2 @@
-application-version=@project.version@
\ No newline at end of file
+application-version=@project.version@
+application-description=@project.description@
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/buildproperties/BuildInfoServiceIntegrationTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/buildproperties/BuildInfoServiceIntegrationTest.java
index cb056fe56d..2cb27e1844 100644
--- a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/buildproperties/BuildInfoServiceIntegrationTest.java
+++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/buildproperties/BuildInfoServiceIntegrationTest.java
@@ -18,7 +18,7 @@ class BuildInfoServiceIntegrationTest {
@Test
void whenGetApplicationDescription_thenSuccess() {
- assertThat(service.getApplicationDescription(), Matchers.is("This is simple boot application for Spring boot actuator test"));
+ assertThat(service.getApplicationDescription(), Matchers.is("Spring Boot Properties Module"));
assertThat(service.getApplicationVersion(), Matchers.is("0.0.1-SNAPSHOT"));
}
}
diff --git a/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configuration/processor/PropertyBeanInjectionUnitTest.java b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configuration/processor/PropertyBeanInjectionUnitTest.java
new file mode 100644
index 0000000000..bdeb6547c3
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/test/java/com/baeldung/configuration/processor/PropertyBeanInjectionUnitTest.java
@@ -0,0 +1,24 @@
+package com.baeldung.configuration.processor;
+
+import org.junit.jupiter.api.*;
+import org.junit.runner.*;
+import org.springframework.beans.factory.annotation.*;
+import org.springframework.boot.test.context.*;
+import org.springframework.test.context.*;
+import org.springframework.test.context.junit4.*;
+
+@RunWith(SpringRunner.class)
+@TestPropertySource("/configuration-processor.properties")
+@SpringBootTest(classes = DemoApplication.class)
+class PropertyBeanInjectionUnitTest {
+
+ @Autowired
+ private PropertyBeanInjection propertyBeanInjection;
+
+ @Test
+ void checkThatCustomPropertiesHaveTheCorrectValueFromPropertiesFile() {
+ Assertions.assertEquals("www.abc.test.com", propertyBeanInjection.getUrl());
+ Assertions.assertEquals(2000, propertyBeanInjection.getTimeoutInMilliseconds());
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-properties/src/test/resources/configuration-processor.properties b/spring-boot-modules/spring-boot-properties/src/test/resources/configuration-processor.properties
new file mode 100644
index 0000000000..00369f2eff
--- /dev/null
+++ b/spring-boot-modules/spring-boot-properties/src/test/resources/configuration-processor.properties
@@ -0,0 +1,2 @@
+com.baeldung.url=www.abc.test.com
+com.baeldung.timeout-in-milli-seconds=2000
diff --git a/spring-boot-modules/spring-boot-runtime/disabling-console-logback/README.md b/spring-boot-modules/spring-boot-runtime/disabling-console-logback/README.md
deleted file mode 100644
index 554f051b41..0000000000
--- a/spring-boot-modules/spring-boot-runtime/disabling-console-logback/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Relevant Articles:
-
-- [How to Disable Console Logging in Spring Boot](https://www.baeldung.com/spring-boot-disable-console-logging)
diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/cors/AccountController.java b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/cors/AccountController.java
index c387eb2121..2a4156a392 100644
--- a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/cors/AccountController.java
+++ b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/cors/AccountController.java
@@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.RestController;
public class AccountController {
@CrossOrigin("http://example.com")
- @RequestMapping("/{id}")
+ @RequestMapping(method = RequestMethod.GET, path = "/{id}")
public Account retrieve(@PathVariable Long id) {
return new Account(id);
}
diff --git a/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/cors/config/WebConfig.java b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/cors/config/WebConfig.java
new file mode 100644
index 0000000000..c3179621b7
--- /dev/null
+++ b/spring-boot-modules/spring-boot-runtime/src/main/java/com/baeldung/cors/config/WebConfig.java
@@ -0,0 +1,16 @@
+package com.baeldung.cors.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+@EnableWebMvc
+public class WebConfig implements WebMvcConfigurer {
+
+ @Override
+ public void addCorsMappings(CorsRegistry registry) {
+ registry.addMapping("/**");
+ }
+}
diff --git a/spring-boot-modules/spring-boot-springdoc/pom.xml b/spring-boot-modules/spring-boot-springdoc/pom.xml
index 9212e56c5a..fd8a9e71ae 100644
--- a/spring-boot-modules/spring-boot-springdoc/pom.xml
+++ b/spring-boot-modules/spring-boot-springdoc/pom.xml
@@ -17,8 +17,8 @@
-
1.8
+ 1.2.32
@@ -26,6 +26,14 @@
org.springframework.bootspring-boot-starter-web
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ com.h2database
+ h2
+ org.springframework.boot
@@ -36,24 +44,13 @@
org.springdoc
- springdoc-openapi-core
- 1.1.49
-
-
- io.github.classgraph
- classgraph
-
-
+ springdoc-openapi-ui
+ ${springdoc.version}org.springdoc
- springdoc-openapi-ui
- 1.1.49
-
-
- io.github.classgraph
- classgraph
- 4.8.44
+ springdoc-openapi-data-rest
+ ${springdoc.version}
diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/springdoc/controller/BookController.java b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/springdoc/controller/BookController.java
index 4d7d9e3d85..05f8c5a946 100644
--- a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/springdoc/controller/BookController.java
+++ b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/springdoc/controller/BookController.java
@@ -6,6 +6,8 @@ import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
@@ -41,6 +43,11 @@ public class BookController {
return repository.getBooks();
}
+ @GetMapping("/filter")
+ public Page filterBooks(Pageable pageable) {
+ return repository.getBooks(pageable);
+ }
+
@PutMapping("/{id}")
@ResponseStatus(HttpStatus.OK)
public Book updateBook(@PathVariable("id") final String id, @RequestBody final Book book) {
diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/springdoc/repository/BookRepository.java b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/springdoc/repository/BookRepository.java
index 4040ba28c2..0e3636d084 100644
--- a/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/springdoc/repository/BookRepository.java
+++ b/spring-boot-modules/spring-boot-springdoc/src/main/java/com/baeldung/springdoc/repository/BookRepository.java
@@ -1,13 +1,14 @@
package com.baeldung.springdoc.repository;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Optional;
-
+import com.baeldung.springdoc.model.Book;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Repository;
-import com.baeldung.springdoc.model.Book;
+import java.util.*;
+
+import static java.util.stream.Collectors.toList;
@Repository
public class BookRepository {
@@ -25,4 +26,11 @@ public class BookRepository {
public Collection getBooks() {
return books.values();
}
+
+ public Page getBooks(Pageable pageable) {
+ int toSkip = pageable.getPageSize() * pageable.getPageNumber();
+ List result = books.values().stream().skip(toSkip).limit(pageable.getPageSize()).collect(toList());
+
+ return new PageImpl<>(result, pageable, books.size());
+ }
}
diff --git a/spring-boot-modules/spring-boot-springdoc/src/main/resources/application.properties b/spring-boot-modules/spring-boot-springdoc/src/main/resources/application.properties
index f03e90feb6..45378e610b 100644
--- a/spring-boot-modules/spring-boot-springdoc/src/main/resources/application.properties
+++ b/spring-boot-modules/spring-boot-springdoc/src/main/resources/application.properties
@@ -3,3 +3,6 @@ springdoc.swagger-ui.path=/swagger-ui-custom.html
# custom path for api docs
springdoc.api-docs.path=/api-docs
+
+# H2 Related Configurations
+spring.datasource.url=jdbc:h2:mem:springdoc
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-testing/pom.xml b/spring-boot-modules/spring-boot-testing/pom.xml
index 8b16b13733..8353f9de61 100644
--- a/spring-boot-modules/spring-boot-testing/pom.xml
+++ b/spring-boot-modules/spring-boot-testing/pom.xml
@@ -132,7 +132,6 @@
1.2-groovy-2.41.60.7.2
- 2.1.9.RELEASE
diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/Credentials.java b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/Credentials.java
new file mode 100644
index 0000000000..e51937cf57
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/Credentials.java
@@ -0,0 +1,28 @@
+package com.baeldung.boot.configurationproperties;
+
+public class Credentials {
+
+ private String username;
+ private String password;
+
+ public Credentials(String username, String password) {
+ this.username = username;
+ this.password = password;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+}
diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/CustomCredentialsConverter.java b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/CustomCredentialsConverter.java
new file mode 100644
index 0000000000..ef160c8c9a
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/CustomCredentialsConverter.java
@@ -0,0 +1,16 @@
+package com.baeldung.boot.configurationproperties;
+
+import org.springframework.boot.context.properties.ConfigurationPropertiesBinding;
+import org.springframework.core.convert.converter.Converter;
+import org.springframework.stereotype.Component;
+
+@Component
+@ConfigurationPropertiesBinding
+public class CustomCredentialsConverter implements Converter {
+
+ @Override
+ public Credentials convert(String source) {
+ String[] data = source.split(",");
+ return new Credentials(data[0], data[1]);
+ }
+}
diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/MailServer.java b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/MailServer.java
new file mode 100644
index 0000000000..e23b30759b
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/MailServer.java
@@ -0,0 +1,59 @@
+package com.baeldung.boot.configurationproperties;
+
+import java.util.Map;
+
+import javax.validation.Valid;
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.validation.annotation.Validated;
+
+@Configuration
+@ConfigurationProperties(prefix = "validate")
+@PropertySource("classpath:property-validation.properties")
+@Validated
+public class MailServer {
+
+ @NotNull
+ @NotEmpty
+ private Map propertiesMap;
+
+ @Valid
+ private MailConfig mailConfig = new MailConfig();
+
+ public static class MailConfig {
+
+ @NotBlank
+ @Email
+ private String address;
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+ }
+
+ public Map getPropertiesMap() {
+ return propertiesMap;
+ }
+
+ public void setPropertiesMap(Map propertiesMap) {
+ this.propertiesMap = propertiesMap;
+ }
+
+ public MailConfig getMailConfig() {
+ return mailConfig;
+ }
+
+ public void setMailConfig(MailConfig mailConfig) {
+ this.mailConfig = mailConfig;
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/PropertyConversion.java b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/PropertyConversion.java
new file mode 100644
index 0000000000..9b2ea39299
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/PropertyConversion.java
@@ -0,0 +1,67 @@
+package com.baeldung.boot.configurationproperties;
+
+import java.time.Duration;
+import java.time.temporal.ChronoUnit;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.convert.DataSizeUnit;
+import org.springframework.boot.convert.DurationUnit;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.util.unit.DataSize;
+import org.springframework.util.unit.DataUnit;
+
+@Configuration
+@ConfigurationProperties(prefix = "server")
+public class PropertyConversion {
+
+ private DataSize uploadSpeed;
+
+ @DataSizeUnit(DataUnit.GIGABYTES)
+ private DataSize downloadSpeed;
+
+ private Duration backupDay;
+
+ @DurationUnit(ChronoUnit.HOURS)
+ private Duration backupHour;
+
+ private Credentials credentials;
+
+ public Duration getBackupDay() {
+ return backupDay;
+ }
+
+ public void setBackupDay(Duration backupDay) {
+ this.backupDay = backupDay;
+ }
+
+ public Duration getBackupHour() {
+ return backupHour;
+ }
+
+ public void setBackupHour(Duration backupHour) {
+ this.backupHour = backupHour;
+ }
+
+ public DataSize getUploadSpeed() {
+ return uploadSpeed;
+ }
+
+ public void setUploadSpeed(DataSize uploadSpeed) {
+ this.uploadSpeed = uploadSpeed;
+ }
+
+ public DataSize getDownloadSpeed() {
+ return downloadSpeed;
+ }
+
+ public void setDownloadSpeed(DataSize downloadSpeed) {
+ this.downloadSpeed = downloadSpeed;
+ }
+
+ public Credentials getCredentials() {
+ return credentials;
+ }
+
+ public void setCredentials(Credentials credentials) {
+ this.credentials = credentials;
+ }
+}
diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/ServerConfig.java b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/ServerConfig.java
new file mode 100644
index 0000000000..0c9e62445a
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/ServerConfig.java
@@ -0,0 +1,43 @@
+package com.baeldung.boot.configurationproperties;
+
+import java.util.Map;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ConfigurationProperties(prefix = "server")
+public class ServerConfig {
+
+ private Address address;
+ private Map resourcesPath;
+
+ public static class Address {
+
+ private String ip;
+
+ public String getIp() {
+ return ip;
+ }
+
+ public void setIp(String ip) {
+ this.ip = ip;
+ }
+ }
+
+ public Address getAddress() {
+ return address;
+ }
+
+ public void setAddress(Address address) {
+ this.address = address;
+ }
+
+ public Map getResourcesPath() {
+ return resourcesPath;
+ }
+
+ public void setResourcesPath(Map resourcesPath) {
+ this.resourcesPath = resourcesPath;
+ }
+}
diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/ServerConfigFactory.java b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/ServerConfigFactory.java
new file mode 100644
index 0000000000..ca85d59112
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/boot/configurationproperties/ServerConfigFactory.java
@@ -0,0 +1,15 @@
+package com.baeldung.boot.configurationproperties;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class ServerConfigFactory {
+
+ @Bean(name = "default_bean")
+ @ConfigurationProperties(prefix = "server.default")
+ public ServerConfig getDefaultConfigs() {
+ return new ServerConfig();
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-testing/src/main/resources/property-validation.properties b/spring-boot-modules/spring-boot-testing/src/main/resources/property-validation.properties
new file mode 100644
index 0000000000..6b4c881dc0
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing/src/main/resources/property-validation.properties
@@ -0,0 +1,4 @@
+validate.propertiesMap.first=prop1
+validate.propertiesMap.second=prop2
+
+validate.mail_config.address=user1@test
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy b/spring-boot-modules/spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy
index d8b4e03adc..fe53abd241 100644
--- a/spring-boot-modules/spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy
+++ b/spring-boot-modules/spring-boot-testing/src/test/groovy/com/baeldung/boot/WebControllerTest.groovy
@@ -1,8 +1,10 @@
package com.baeldung.boot
import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration
+import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc
-import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest
+import org.springframework.boot.test.context.SpringBootTest
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders
import org.springframework.test.web.servlet.result.MockMvcResultMatchers
@@ -12,8 +14,9 @@ import spock.lang.Title
@Title("WebController Specification")
@Narrative("The Specification of the behaviour of the WebController. It can greet a person, change the name and reset it to 'world'")
-@AutoConfigureMockMvc(secure=false)
-@WebMvcTest()
+@SpringBootTest
+@AutoConfigureMockMvc
+@EnableAutoConfiguration(exclude= SecurityAutoConfiguration.class)
class WebControllerTest extends Specification {
@Autowired
diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/BindingPropertiesToBeanMethodsUnitTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/BindingPropertiesToBeanMethodsUnitTest.java
new file mode 100644
index 0000000000..82c2a55c32
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/BindingPropertiesToBeanMethodsUnitTest.java
@@ -0,0 +1,36 @@
+package com.baeldung.boot.configurationproperties;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+@ExtendWith(SpringExtension.class)
+@EnableConfigurationProperties(value = ServerConfig.class)
+@ContextConfiguration(classes = ServerConfigFactory.class)
+@TestPropertySource("classpath:server-config-test.properties")
+public class BindingPropertiesToBeanMethodsUnitTest {
+
+ @Autowired
+ @Qualifier("default_bean")
+ private ServerConfig serverConfig;
+
+ @Test
+ void givenBeanAnnotatedMethod_whenBindingProperties_thenAllFieldsAreSet() {
+ assertEquals("192.168.0.2", serverConfig.getAddress()
+ .getIp());
+
+ Map expectedResourcesPath = new HashMap<>();
+ expectedResourcesPath.put("imgs", "/root/def/imgs");
+ assertEquals(expectedResourcesPath, serverConfig.getResourcesPath());
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/BindingPropertiesToUserDefinedPOJOUnitTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/BindingPropertiesToUserDefinedPOJOUnitTest.java
new file mode 100644
index 0000000000..9db906fa04
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/BindingPropertiesToUserDefinedPOJOUnitTest.java
@@ -0,0 +1,32 @@
+package com.baeldung.boot.configurationproperties;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+@ExtendWith(SpringExtension.class)
+@EnableConfigurationProperties(value = ServerConfig.class)
+@TestPropertySource("classpath:server-config-test.properties")
+public class BindingPropertiesToUserDefinedPOJOUnitTest {
+
+ @Autowired
+ private ServerConfig serverConfig;
+
+ @Test
+ void givenUserDefinedPOJO_whenBindingPropertiesFile_thenAllFieldsAreSet() {
+ assertEquals("192.168.0.1", serverConfig.getAddress()
+ .getIp());
+
+ Map expectedResourcesPath = new HashMap<>();
+ expectedResourcesPath.put("imgs", "/root/imgs");
+ assertEquals(expectedResourcesPath, serverConfig.getResourcesPath());
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/BindingYMLPropertiesUnitTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/BindingYMLPropertiesUnitTest.java
new file mode 100644
index 0000000000..5543f5e9e8
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/BindingYMLPropertiesUnitTest.java
@@ -0,0 +1,33 @@
+package com.baeldung.boot.configurationproperties;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import java.util.HashMap;
+import java.util.Map;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.boot.test.context.ConfigFileApplicationContextInitializer;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+@ExtendWith(SpringExtension.class)
+@ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class)
+@EnableConfigurationProperties(value = ServerConfig.class)
+@ActiveProfiles("test")
+public class BindingYMLPropertiesUnitTest {
+
+ @Autowired
+ private ServerConfig serverConfig;
+
+ @Test
+ void whenBindingYMLConfigFile_thenAllFieldsAreSet() {
+ assertEquals("192.168.0.4", serverConfig.getAddress()
+ .getIp());
+
+ Map expectedResourcesPath = new HashMap<>();
+ expectedResourcesPath.put("imgs", "/etc/test/imgs");
+ assertEquals(expectedResourcesPath, serverConfig.getResourcesPath());
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/OverridingConfigurationPropertiesUnitTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/OverridingConfigurationPropertiesUnitTest.java
new file mode 100644
index 0000000000..2779b0a313
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/OverridingConfigurationPropertiesUnitTest.java
@@ -0,0 +1,33 @@
+package com.baeldung.boot.configurationproperties;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+@ExtendWith(SpringExtension.class)
+@EnableConfigurationProperties(value = MailServer.class)
+@TestPropertySource(properties = { "validate.mail_config.address=new_user@test" })
+public class OverridingConfigurationPropertiesUnitTest {
+
+ @Autowired
+ private MailServer mailServer;
+
+ @Test
+ void givenUsingPropertiesAttribute_whenAssiginingNewValueToProprty_thenSpringUsesNewValue() {
+ assertEquals("new_user@test", mailServer.getMailConfig()
+ .getAddress());
+
+ Map expectedMap = new HashMap<>();
+ expectedMap.put("first", "prop1");
+ expectedMap.put("second", "prop2");
+ assertEquals(expectedMap, mailServer.getPropertiesMap());
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/PropertyValidationUnitTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/PropertyValidationUnitTest.java
new file mode 100644
index 0000000000..939471dd67
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/PropertyValidationUnitTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.boot.configurationproperties;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import javax.validation.Validation;
+import javax.validation.Validator;
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+@ExtendWith(SpringExtension.class)
+@EnableConfigurationProperties(value = MailServer.class)
+@TestPropertySource("classpath:property-validation-test.properties")
+public class PropertyValidationUnitTest {
+
+ @Autowired
+ private MailServer mailServer;
+
+ private static Validator propertyValidator;
+
+ @BeforeAll
+ public static void setup() {
+ propertyValidator = Validation.buildDefaultValidatorFactory()
+ .getValidator();
+ }
+
+ @Test
+ void whenBindingPropertiesToValidatedBeans_thenConstrainsAreChecked() {
+ assertEquals(0, propertyValidator.validate(mailServer.getPropertiesMap())
+ .size());
+ assertEquals(0, propertyValidator.validate(mailServer.getMailConfig())
+ .size());
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/SpringPropertiesConversionUnitTest.java b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/SpringPropertiesConversionUnitTest.java
new file mode 100644
index 0000000000..3f2da2a669
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/boot/configurationproperties/SpringPropertiesConversionUnitTest.java
@@ -0,0 +1,44 @@
+package com.baeldung.boot.configurationproperties;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.time.Duration;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+import org.springframework.util.unit.DataSize;
+
+@ExtendWith(SpringExtension.class)
+@EnableConfigurationProperties(value = PropertyConversion.class)
+@ContextConfiguration(classes = CustomCredentialsConverter.class)
+@TestPropertySource("classpath:spring-conversion-test.properties")
+public class SpringPropertiesConversionUnitTest {
+
+ @Autowired
+ private PropertyConversion propertyConversion;
+
+ @Test
+ void whenUsingSpringDefaultSizeConversion_thenDataSizeObjectIsSet() {
+ assertEquals(DataSize.ofMegabytes(500), propertyConversion.getUploadSpeed());
+ assertEquals(DataSize.ofGigabytes(10), propertyConversion.getDownloadSpeed());
+ }
+
+ @Test
+ void whenUsingSpringDefaultDurationConversion_thenDurationObjectIsSet() {
+ assertEquals(Duration.ofDays(1), propertyConversion.getBackupDay());
+ assertEquals(Duration.ofHours(8), propertyConversion.getBackupHour());
+ }
+
+ @Test
+ void whenRegisteringCustomCredentialsConverter_thenCredentialsAreParsed() {
+ assertEquals("user", propertyConversion.getCredentials()
+ .getUsername());
+ assertEquals("123", propertyConversion.getCredentials()
+ .getPassword());
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-testing/src/test/resources/application.yml b/spring-boot-modules/spring-boot-testing/src/test/resources/application.yml
new file mode 100644
index 0000000000..1b46b0f1ff
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing/src/test/resources/application.yml
@@ -0,0 +1,15 @@
+spring:
+ profiles: test
+server:
+ address:
+ ip: 192.168.0.4
+ resources_path:
+ imgs: /etc/test/imgs
+---
+spring:
+ profiles: dev
+server:
+ address:
+ ip: 192.168.0.5
+ resources_path:
+ imgs: /etc/dev/imgs
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-testing/src/test/resources/property-validation-test.properties b/spring-boot-modules/spring-boot-testing/src/test/resources/property-validation-test.properties
new file mode 100644
index 0000000000..6b4c881dc0
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing/src/test/resources/property-validation-test.properties
@@ -0,0 +1,4 @@
+validate.propertiesMap.first=prop1
+validate.propertiesMap.second=prop2
+
+validate.mail_config.address=user1@test
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-testing/src/test/resources/server-config-test.properties b/spring-boot-modules/spring-boot-testing/src/test/resources/server-config-test.properties
new file mode 100644
index 0000000000..62b23ed1d6
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing/src/test/resources/server-config-test.properties
@@ -0,0 +1,6 @@
+server.address.ip=192.168.0.1
+server.resources_path.imgs=/root/imgs
+
+# default config
+server.default.address.ip=192.168.0.2
+server.default.resources_path.imgs=/root/def/imgs
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-testing/src/test/resources/spring-conversion-test.properties b/spring-boot-modules/spring-boot-testing/src/test/resources/spring-conversion-test.properties
new file mode 100644
index 0000000000..87444cee10
--- /dev/null
+++ b/spring-boot-modules/spring-boot-testing/src/test/resources/spring-conversion-test.properties
@@ -0,0 +1,10 @@
+# bandwidth
+server.upload_speed=500MB
+server.download_speed=10
+
+# backup date
+server.backup_day=1d
+server.backup_hour=8
+
+# custom converter
+server.credentials=user,123
\ No newline at end of file
diff --git a/spring-boot-rest/pom.xml b/spring-boot-rest/pom.xml
index 2483aab6be..10dacf99e8 100644
--- a/spring-boot-rest/pom.xml
+++ b/spring-boot-rest/pom.xml
@@ -95,7 +95,6 @@
27.0.1-jre1.4.11.12.3.5
- 2.1.9.RELEASE
diff --git a/spring-boot-rest/src/main/java/com/baeldung/persistence/config/CustomH2Dialect.java b/spring-boot-rest/src/main/java/com/baeldung/persistence/config/CustomH2Dialect.java
new file mode 100644
index 0000000000..0108f92b2c
--- /dev/null
+++ b/spring-boot-rest/src/main/java/com/baeldung/persistence/config/CustomH2Dialect.java
@@ -0,0 +1,26 @@
+package com.baeldung.persistence.config;
+
+import org.hibernate.dialect.H2Dialect;
+
+/**
+ * Since H2 1.4.200. the behavior of the drop table commands has changed.
+ * Tables are not dropped in a correct order.
+ * Until this is properly fixed directly in Hibernate project,
+ * let's use this custom H2Dialect class to solve this issue.
+ *
+ * @see https://hibernate.atlassian.net/browse/HHH-13711
+ * @see https://github.com/hibernate/hibernate-orm/pull/3093
+ */
+public class CustomH2Dialect extends H2Dialect {
+
+ @Override
+ public boolean dropConstraints() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsIfExistsAfterAlterTable() {
+ return true;
+ }
+
+}
diff --git a/spring-boot-rest/src/main/java/com/baeldung/persistence/model/Customer.java b/spring-boot-rest/src/main/java/com/baeldung/persistence/model/Customer.java
index 10da2e10f0..06b2485c7b 100644
--- a/spring-boot-rest/src/main/java/com/baeldung/persistence/model/Customer.java
+++ b/spring-boot-rest/src/main/java/com/baeldung/persistence/model/Customer.java
@@ -1,14 +1,13 @@
package com.baeldung.persistence.model;
-import java.util.Map;
-
-import org.springframework.hateoas.ResourceSupport;
-
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import org.springframework.hateoas.RepresentationModel;
+
+import java.util.Map;
@JsonInclude(Include.NON_NULL)
-public class Customer extends ResourceSupport {
+public class Customer extends RepresentationModel {
private String customerId;
private String customerName;
private String companyName;
diff --git a/spring-boot-rest/src/main/java/com/baeldung/persistence/model/Order.java b/spring-boot-rest/src/main/java/com/baeldung/persistence/model/Order.java
index 7aea9bce5c..b5e1a2cee2 100644
--- a/spring-boot-rest/src/main/java/com/baeldung/persistence/model/Order.java
+++ b/spring-boot-rest/src/main/java/com/baeldung/persistence/model/Order.java
@@ -1,8 +1,8 @@
package com.baeldung.persistence.model;
-import org.springframework.hateoas.ResourceSupport;
+import org.springframework.hateoas.RepresentationModel;
-public class Order extends ResourceSupport {
+public class Order extends RepresentationModel {
private String orderId;
private double price;
private int quantity;
diff --git a/spring-boot-rest/src/main/java/com/baeldung/requestresponsebody/ExamplePostController.java b/spring-boot-rest/src/main/java/com/baeldung/requestresponsebody/ExamplePostController.java
index 90211b11a3..ac1d28bb72 100644
--- a/spring-boot-rest/src/main/java/com/baeldung/requestresponsebody/ExamplePostController.java
+++ b/spring-boot-rest/src/main/java/com/baeldung/requestresponsebody/ExamplePostController.java
@@ -1,11 +1,11 @@
package com.baeldung.requestresponsebody;
import com.baeldung.services.ExampleService;
-
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
@@ -34,4 +34,18 @@ public class ExamplePostController {
log.debug("POST received - serializing LoginForm: " + loginForm.getPassword() + " " + loginForm.getUsername());
return new ResponseTransfer("Thanks For Posting!!!");
}
+
+ @PostMapping(value = "/content", produces = MediaType.APPLICATION_JSON_VALUE)
+ @ResponseBody
+ public ResponseTransfer postResponseJsonContent(@RequestBody LoginForm loginForm) {
+ log.debug("POST received - serializing LoginForm: " + loginForm.getPassword() + " " + loginForm.getUsername());
+ return new ResponseTransfer("JSON Content!");
+ }
+
+ @PostMapping(value = "/content", produces = MediaType.APPLICATION_XML_VALUE)
+ @ResponseBody
+ public ResponseTransfer postResponseXmlContent(@RequestBody LoginForm loginForm) {
+ log.debug("POST received - serializing LoginForm: " + loginForm.getPassword() + " " + loginForm.getUsername());
+ return new ResponseTransfer("XML Content!");
+ }
}
\ No newline at end of file
diff --git a/spring-boot-rest/src/main/java/com/baeldung/web/controller/CustomerController.java b/spring-boot-rest/src/main/java/com/baeldung/web/controller/CustomerController.java
index 91aa9f2144..2b7dc1eee1 100644
--- a/spring-boot-rest/src/main/java/com/baeldung/web/controller/CustomerController.java
+++ b/spring-boot-rest/src/main/java/com/baeldung/web/controller/CustomerController.java
@@ -1,13 +1,13 @@
package com.baeldung.web.controller;
-import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
-import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
+import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.Link;
-import org.springframework.hateoas.Resources;
+import org.springframework.hateoas.CollectionModel;
import org.springframework.hateoas.config.EnableHypermediaSupport;
import org.springframework.hateoas.config.EnableHypermediaSupport.HypermediaType;
import org.springframework.web.bind.annotation.GetMapping;
@@ -41,7 +41,7 @@ public class CustomerController {
}
@GetMapping(value = "/{customerId}/orders", produces = { "application/hal+json" })
- public Resources getOrdersForCustomer(@PathVariable final String customerId) {
+ public CollectionModel getOrdersForCustomer(@PathVariable final String customerId) {
final List orders = orderService.getAllOrdersForCustomer(customerId);
for (final Order order : orders) {
final Link selfLink = linkTo(
@@ -50,12 +50,12 @@ public class CustomerController {
}
Link link = linkTo(methodOn(CustomerController.class).getOrdersForCustomer(customerId)).withSelfRel();
- Resources result = new Resources<>(orders, link);
+ CollectionModel result = new CollectionModel<>(orders, link);
return result;
}
@GetMapping(produces = { "application/hal+json" })
- public Resources getAllCustomers() {
+ public CollectionModel getAllCustomers() {
final List allCustomers = customerService.allCustomers();
for (final Customer customer : allCustomers) {
@@ -72,7 +72,7 @@ public class CustomerController {
}
Link link = linkTo(CustomerController.class).withSelfRel();
- Resources result = new Resources<>(allCustomers, link);
+ CollectionModel result = new CollectionModel<>(allCustomers, link);
return result;
}
diff --git a/spring-boot-rest/src/main/java/com/baeldung/web/controller/FooController.java b/spring-boot-rest/src/main/java/com/baeldung/web/controller/FooController.java
index 8174480078..a09878fb84 100644
--- a/spring-boot-rest/src/main/java/com/baeldung/web/controller/FooController.java
+++ b/spring-boot-rest/src/main/java/com/baeldung/web/controller/FooController.java
@@ -4,6 +4,8 @@ import java.util.List;
import javax.servlet.http.HttpServletResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.data.domain.Page;
@@ -11,6 +13,7 @@ import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
@@ -25,6 +28,8 @@ import org.springframework.web.util.UriComponentsBuilder;
import com.baeldung.persistence.model.Foo;
import com.baeldung.persistence.service.IFooService;
+import com.baeldung.web.exception.CustomException1;
+import com.baeldung.web.exception.CustomException2;
import com.baeldung.web.exception.MyResourceNotFoundException;
import com.baeldung.web.hateoas.event.PaginatedResultsRetrievedEvent;
import com.baeldung.web.hateoas.event.ResourceCreatedEvent;
@@ -36,6 +41,8 @@ import com.google.common.base.Preconditions;
@RequestMapping(value = "/foos")
public class FooController {
+ private static final Logger logger = LoggerFactory.getLogger(FooController.class);
+
@Autowired
private ApplicationEventPublisher eventPublisher;
@@ -137,4 +144,10 @@ public class FooController {
public void delete(@PathVariable("id") final Long id) {
service.deleteById(id);
}
+
+ @ExceptionHandler({ CustomException1.class, CustomException2.class })
+ public void handleException(final Exception ex) {
+ final String error = "Application specific error handling";
+ logger.error(error, ex);
+ }
}
diff --git a/spring-boot-rest/src/main/java/com/baeldung/web/error/RestResponseStatusExceptionResolver.java b/spring-boot-rest/src/main/java/com/baeldung/web/error/RestResponseStatusExceptionResolver.java
new file mode 100644
index 0000000000..6753ab35cf
--- /dev/null
+++ b/spring-boot-rest/src/main/java/com/baeldung/web/error/RestResponseStatusExceptionResolver.java
@@ -0,0 +1,73 @@
+package com.baeldung.web.error;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.xml.XmlMapper;
+
+@Component
+public class RestResponseStatusExceptionResolver extends AbstractHandlerExceptionResolver {
+
+ private static final Logger logger = LoggerFactory.getLogger(RestResponseStatusExceptionResolver.class);
+
+ @Override
+ protected ModelAndView doResolveException(HttpServletRequest request,
+ HttpServletResponse response, Object handler, Exception ex) {
+ try {
+ if (ex instanceof IllegalArgumentException) {
+ return handleIllegalArgument(
+ (IllegalArgumentException) ex, request, response, handler);
+ }
+ } catch (Exception handlerException) {
+ logger.warn("Handling of [{}] resulted in Exception", ex.getClass().getName(), handlerException);
+ }
+ return null;
+ }
+
+ private ModelAndView handleIllegalArgument(IllegalArgumentException ex,
+ final HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+ final String accept = request.getHeader(HttpHeaders.ACCEPT);
+
+ response.sendError(HttpServletResponse.SC_CONFLICT);
+ response.setHeader("ContentType", accept);
+
+ final ModelAndView modelAndView = new ModelAndView("error");
+ modelAndView.addObject("error", prepareErrorResponse(accept));
+ return modelAndView;
+ }
+
+ /** Prepares error object based on the provided accept type.
+ * @param accept The Accept header present in the request.
+ * @return The response to return
+ * @throws JsonProcessingException
+ */
+ private String prepareErrorResponse(String accept) throws JsonProcessingException {
+ final Map error = new HashMap<>();
+ error.put("Error", "Application specific error message");
+
+ final String response;
+ if(MediaType.APPLICATION_JSON_VALUE.equals(accept)) {
+ response = new ObjectMapper().writeValueAsString(error);
+ } else {
+ response = new XmlMapper().writeValueAsString(error);
+ }
+
+ return response;
+ }
+
+
+
+}
diff --git a/spring-boot-rest/src/main/java/com/baeldung/web/exception/CustomException1.java b/spring-boot-rest/src/main/java/com/baeldung/web/exception/CustomException1.java
new file mode 100644
index 0000000000..ed8d34ae2b
--- /dev/null
+++ b/spring-boot-rest/src/main/java/com/baeldung/web/exception/CustomException1.java
@@ -0,0 +1,7 @@
+package com.baeldung.web.exception;
+
+public class CustomException1 extends RuntimeException {
+
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/spring-boot-rest/src/main/java/com/baeldung/web/exception/CustomException2.java b/spring-boot-rest/src/main/java/com/baeldung/web/exception/CustomException2.java
new file mode 100644
index 0000000000..39b6c98a82
--- /dev/null
+++ b/spring-boot-rest/src/main/java/com/baeldung/web/exception/CustomException2.java
@@ -0,0 +1,7 @@
+package com.baeldung.web.exception;
+
+public class CustomException2 extends RuntimeException {
+
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/spring-boot-rest/src/main/java/com/baeldung/web/exception/MyResourceNotFoundException.java b/spring-boot-rest/src/main/java/com/baeldung/web/exception/MyResourceNotFoundException.java
index fd002efc28..59bcfde57a 100644
--- a/spring-boot-rest/src/main/java/com/baeldung/web/exception/MyResourceNotFoundException.java
+++ b/spring-boot-rest/src/main/java/com/baeldung/web/exception/MyResourceNotFoundException.java
@@ -1,5 +1,9 @@
package com.baeldung.web.exception;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+@ResponseStatus(value = HttpStatus.NOT_FOUND)
public final class MyResourceNotFoundException extends RuntimeException {
public MyResourceNotFoundException() {
diff --git a/spring-boot-rest/src/main/resources/persistence-h2.properties b/spring-boot-rest/src/main/resources/persistence-h2.properties
index 839a466533..efbf3f7db7 100644
--- a/spring-boot-rest/src/main/resources/persistence-h2.properties
+++ b/spring-boot-rest/src/main/resources/persistence-h2.properties
@@ -17,6 +17,6 @@ jdbc.user=sa
jdbc.pass=
# hibernate.X
-hibernate.dialect=org.hibernate.dialect.H2Dialect
+hibernate.dialect=com.baeldung.persistence.config.CustomH2Dialect
hibernate.show_sql=false
hibernate.hbm2ddl.auto=create-drop
diff --git a/spring-boot-rest/src/test/java/com/baeldung/test/JacksonMarshaller.java b/spring-boot-rest/src/test/java/com/baeldung/test/JacksonMarshaller.java
index 23b5d60b6b..0f89e0a9de 100644
--- a/spring-boot-rest/src/test/java/com/baeldung/test/JacksonMarshaller.java
+++ b/spring-boot-rest/src/test/java/com/baeldung/test/JacksonMarshaller.java
@@ -60,7 +60,7 @@ public final class JacksonMarshaller implements IMarshaller {
List entities = null;
try {
if (clazz.equals(Foo.class)) {
- entities = objectMapper.readValue(resourcesAsString, new TypeReference>() {
+ entities = objectMapper.readValue(resourcesAsString, new TypeReference>() {
// ...
});
} else {
diff --git a/spring-boot-rest/src/test/java/com/baeldung/web/FooControllerWebLayerIntegrationTest.java b/spring-boot-rest/src/test/java/com/baeldung/web/FooControllerWebLayerIntegrationTest.java
index bd98523b0a..4d4a274b1a 100644
--- a/spring-boot-rest/src/test/java/com/baeldung/web/FooControllerWebLayerIntegrationTest.java
+++ b/spring-boot-rest/src/test/java/com/baeldung/web/FooControllerWebLayerIntegrationTest.java
@@ -10,8 +10,10 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
import java.util.Collections;
import org.hamcrest.Matchers;
+import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
@@ -24,6 +26,7 @@ import org.springframework.test.web.servlet.MockMvc;
import com.baeldung.persistence.model.Foo;
import com.baeldung.persistence.service.IFooService;
import com.baeldung.web.controller.FooController;
+import com.baeldung.web.exception.CustomException1;
import com.baeldung.web.hateoas.event.PaginatedResultsRetrievedEvent;
/**
@@ -56,5 +59,15 @@ public class FooControllerWebLayerIntegrationTest {
.andExpect(status().isOk())
.andExpect(jsonPath("$",Matchers.hasSize(1)));
}
-
+
+ @Test
+ public void delete_forException_fromService() throws Exception {
+ Mockito.when(service.findAll()).thenThrow(new CustomException1());
+ this.mockMvc.perform(get("/foos")).andDo(h -> {
+ final Exception expectedException = h.getResolvedException();
+ Assert.assertTrue(expectedException instanceof CustomException1);
+
+ });
+ }
+
}
diff --git a/spring-caching/README.md b/spring-caching/README.md
index 14dfe94041..3efbfe3eaa 100644
--- a/spring-caching/README.md
+++ b/spring-caching/README.md
@@ -2,3 +2,4 @@
- [Introduction To Ehcache](http://www.baeldung.com/ehcache)
- [A Guide To Caching in Spring](http://www.baeldung.com/spring-cache-tutorial)
- [Spring Cache – Creating a Custom KeyGenerator](http://www.baeldung.com/spring-cache-custom-keygenerator)
+- [Cache Eviction in Spring Boot](https://www.baeldung.com/spring-boot-evict-cache)
diff --git a/spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-cloud-bus/spring-cloud-config-client/src/test/java/com/baeldung/SpringContextLiveTest.java
similarity index 98%
rename from spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextLiveTest.java
rename to spring-cloud-bus/spring-cloud-config-client/src/test/java/com/baeldung/SpringContextLiveTest.java
index a401d41e1e..de1f96a168 100644
--- a/spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextLiveTest.java
+++ b/spring-cloud-bus/spring-cloud-config-client/src/test/java/com/baeldung/SpringContextLiveTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud-bus/spring-cloud-config-server/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud-bus/spring-cloud-config-server/src/test/java/com/baeldung/SpringContextTest.java
similarity index 94%
rename from spring-cloud-bus/spring-cloud-config-server/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-cloud-bus/spring-cloud-config-server/src/test/java/com/baeldung/SpringContextTest.java
index 19ca53c4a7..0770db220c 100644
--- a/spring-cloud-bus/spring-cloud-config-server/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-cloud-bus/spring-cloud-config-server/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud-data-flow/batch-job/pom.xml b/spring-cloud-data-flow/batch-job/pom.xml
index 1ed0017bc0..e11df0df8e 100644
--- a/spring-cloud-data-flow/batch-job/pom.xml
+++ b/spring-cloud-data-flow/batch-job/pom.xml
@@ -2,7 +2,7 @@
4.0.0
- org.baeldung.spring.cloud
+ com.baeldung.spring.cloudbatch-job0.0.1-SNAPSHOTbatch-job
diff --git a/spring-cloud-data-flow/batch-job/src/main/java/org/baeldung/spring/cloud/BatchJobApplication.java b/spring-cloud-data-flow/batch-job/src/main/java/com/baeldung/spring/cloud/BatchJobApplication.java
similarity index 91%
rename from spring-cloud-data-flow/batch-job/src/main/java/org/baeldung/spring/cloud/BatchJobApplication.java
rename to spring-cloud-data-flow/batch-job/src/main/java/com/baeldung/spring/cloud/BatchJobApplication.java
index 30f6ff6897..6eea25f16f 100644
--- a/spring-cloud-data-flow/batch-job/src/main/java/org/baeldung/spring/cloud/BatchJobApplication.java
+++ b/spring-cloud-data-flow/batch-job/src/main/java/com/baeldung/spring/cloud/BatchJobApplication.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring.cloud;
+package com.baeldung.spring.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-cloud-data-flow/batch-job/src/main/java/org/baeldung/spring/cloud/JobConfiguration.java b/spring-cloud-data-flow/batch-job/src/main/java/com/baeldung/spring/cloud/JobConfiguration.java
similarity index 95%
rename from spring-cloud-data-flow/batch-job/src/main/java/org/baeldung/spring/cloud/JobConfiguration.java
rename to spring-cloud-data-flow/batch-job/src/main/java/com/baeldung/spring/cloud/JobConfiguration.java
index 7ce867b60a..ba30e54446 100644
--- a/spring-cloud-data-flow/batch-job/src/main/java/org/baeldung/spring/cloud/JobConfiguration.java
+++ b/spring-cloud-data-flow/batch-job/src/main/java/com/baeldung/spring/cloud/JobConfiguration.java
@@ -1,39 +1,39 @@
-package org.baeldung.spring.cloud;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.springframework.batch.core.Job;
-import org.springframework.batch.core.StepContribution;
-import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
-import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
-import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
-import org.springframework.batch.core.scope.context.ChunkContext;
-import org.springframework.batch.core.step.tasklet.Tasklet;
-import org.springframework.batch.repeat.RepeatStatus;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-@EnableBatchProcessing
-public class JobConfiguration {
-
- private static final Log logger = LogFactory.getLog(JobConfiguration.class);
-
- @Autowired
- public JobBuilderFactory jobBuilderFactory;
-
- @Autowired
- public StepBuilderFactory stepBuilderFactory;
-
- @Bean
- public Job job() {
- return jobBuilderFactory.get("job").start(stepBuilderFactory.get("jobStep1").tasklet(new Tasklet() {
- @Override
- public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
- logger.info("Job was run");
- return RepeatStatus.FINISHED;
- }
- }).build()).build();
- }
-}
+package com.baeldung.spring.cloud;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.batch.core.Job;
+import org.springframework.batch.core.StepContribution;
+import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
+import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
+import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
+import org.springframework.batch.core.scope.context.ChunkContext;
+import org.springframework.batch.core.step.tasklet.Tasklet;
+import org.springframework.batch.repeat.RepeatStatus;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@EnableBatchProcessing
+public class JobConfiguration {
+
+ private static final Log logger = LogFactory.getLog(JobConfiguration.class);
+
+ @Autowired
+ public JobBuilderFactory jobBuilderFactory;
+
+ @Autowired
+ public StepBuilderFactory stepBuilderFactory;
+
+ @Bean
+ public Job job() {
+ return jobBuilderFactory.get("job").start(stepBuilderFactory.get("jobStep1").tasklet(new Tasklet() {
+ @Override
+ public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
+ logger.info("Job was run");
+ return RepeatStatus.FINISHED;
+ }
+ }).build()).build();
+ }
+}
diff --git a/spring-cloud-data-flow/batch-job/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud-data-flow/batch-job/src/test/java/com/baeldung/SpringContextTest.java
similarity index 86%
rename from spring-cloud-data-flow/batch-job/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-cloud-data-flow/batch-job/src/test/java/com/baeldung/SpringContextTest.java
index 3ac11452d3..0684c32c08 100644
--- a/spring-cloud-data-flow/batch-job/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-cloud-data-flow/batch-job/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,6 +1,6 @@
-package org.baeldung;
+package com.baeldung;
-import org.baeldung.spring.cloud.JobConfiguration;
+import com.baeldung.spring.cloud.JobConfiguration;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
diff --git a/spring-cloud-data-flow/batch-job/src/test/java/org/baeldung/spring/cloud/BatchJobApplicationIntegrationTest.java b/spring-cloud-data-flow/batch-job/src/test/java/com/baeldung/spring/cloud/BatchJobApplicationIntegrationTest.java
similarity index 92%
rename from spring-cloud-data-flow/batch-job/src/test/java/org/baeldung/spring/cloud/BatchJobApplicationIntegrationTest.java
rename to spring-cloud-data-flow/batch-job/src/test/java/com/baeldung/spring/cloud/BatchJobApplicationIntegrationTest.java
index 1f77351acc..0209a0ba5c 100644
--- a/spring-cloud-data-flow/batch-job/src/test/java/org/baeldung/spring/cloud/BatchJobApplicationIntegrationTest.java
+++ b/spring-cloud-data-flow/batch-job/src/test/java/com/baeldung/spring/cloud/BatchJobApplicationIntegrationTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring.cloud;
+package com.baeldung.spring.cloud;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/main/java/org/baeldung/spring/cloud/DataFlowServerApplication.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/main/java/com/baeldung/spring/cloud/DataFlowServerApplication.java
similarity index 92%
rename from spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/main/java/org/baeldung/spring/cloud/DataFlowServerApplication.java
rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/main/java/com/baeldung/spring/cloud/DataFlowServerApplication.java
index 227c10b620..4d742b95c6 100644
--- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/main/java/org/baeldung/spring/cloud/DataFlowServerApplication.java
+++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/main/java/com/baeldung/spring/cloud/DataFlowServerApplication.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring.cloud;
+package com.baeldung.spring.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/com/baeldung/SpringContextTest.java
similarity index 82%
rename from spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/com/baeldung/SpringContextTest.java
index 83cb8067cf..d5b01c8b9c 100644
--- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,6 +1,6 @@
-package org.baeldung;
+package com.baeldung;
-import org.baeldung.spring.cloud.DataFlowServerApplication;
+import com.baeldung.spring.cloud.DataFlowServerApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/org/baeldung/spring/cloud/DataFlowServerApplicationIntegrationTest.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/com/baeldung/spring/cloud/DataFlowServerApplicationIntegrationTest.java
similarity index 97%
rename from spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/org/baeldung/spring/cloud/DataFlowServerApplicationIntegrationTest.java
rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/com/baeldung/spring/cloud/DataFlowServerApplicationIntegrationTest.java
index 9eba12fc12..68f0db60eb 100644
--- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/org/baeldung/spring/cloud/DataFlowServerApplicationIntegrationTest.java
+++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/com/baeldung/spring/cloud/DataFlowServerApplicationIntegrationTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring.cloud;
+package com.baeldung.spring.cloud;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/main/java/org/baeldung/spring/cloud/DataFlowShellApplication.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/main/java/com/baeldung/spring/cloud/DataFlowShellApplication.java
similarity index 91%
rename from spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/main/java/org/baeldung/spring/cloud/DataFlowShellApplication.java
rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/main/java/com/baeldung/spring/cloud/DataFlowShellApplication.java
index 36c421f5bf..82335e792c 100644
--- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/main/java/org/baeldung/spring/cloud/DataFlowShellApplication.java
+++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/main/java/com/baeldung/spring/cloud/DataFlowShellApplication.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring.cloud;
+package com.baeldung.spring.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/test/java/com/baeldung/SpringContextLiveTest.java
similarity index 87%
rename from spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/test/java/org/baeldung/SpringContextLiveTest.java
rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/test/java/com/baeldung/SpringContextLiveTest.java
index 1784eb772a..d899af69a3 100644
--- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/test/java/org/baeldung/SpringContextLiveTest.java
+++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/test/java/com/baeldung/SpringContextLiveTest.java
@@ -1,6 +1,6 @@
-package org.baeldung;
+package com.baeldung;
-import org.baeldung.spring.cloud.DataFlowShellApplication;
+import com.baeldung.spring.cloud.DataFlowShellApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/src/main/java/org/baeldung/spring/cloud/LogSinkApplication.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/src/main/java/com/baeldung/spring/cloud/LogSinkApplication.java
similarity index 95%
rename from spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/src/main/java/org/baeldung/spring/cloud/LogSinkApplication.java
rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/src/main/java/com/baeldung/spring/cloud/LogSinkApplication.java
index a2b9968539..b7fa0a8c85 100644
--- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/src/main/java/org/baeldung/spring/cloud/LogSinkApplication.java
+++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/src/main/java/com/baeldung/spring/cloud/LogSinkApplication.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring.cloud;
+package com.baeldung.spring.cloud;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/src/test/java/com/baeldung/SpringContextTest.java
similarity index 82%
rename from spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/src/test/java/com/baeldung/SpringContextTest.java
index 42903189d3..844ab5f499 100644
--- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,6 +1,6 @@
-package org.baeldung;
+package com.baeldung;
-import org.baeldung.spring.cloud.LogSinkApplication;
+import com.baeldung.spring.cloud.LogSinkApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/src/main/java/org/baeldung/spring/cloud/TimeProcessorApplication.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/src/main/java/com/baeldung/spring/cloud/TimeProcessorApplication.java
similarity index 96%
rename from spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/src/main/java/org/baeldung/spring/cloud/TimeProcessorApplication.java
rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/src/main/java/com/baeldung/spring/cloud/TimeProcessorApplication.java
index 7a2763d436..161fd0ef23 100644
--- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/src/main/java/org/baeldung/spring/cloud/TimeProcessorApplication.java
+++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/src/main/java/com/baeldung/spring/cloud/TimeProcessorApplication.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring.cloud;
+package com.baeldung.spring.cloud;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/src/test/java/com/baeldung/SpringContextTest.java
similarity index 81%
rename from spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/src/test/java/com/baeldung/SpringContextTest.java
index d090e626d2..dc863bad07 100644
--- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,6 +1,6 @@
-package org.baeldung;
+package com.baeldung;
-import org.baeldung.spring.cloud.TimeProcessorApplication;
+import com.baeldung.spring.cloud.TimeProcessorApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/src/main/java/org/baeldung/spring/cloud/TimeSourceApplication.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/src/main/java/com/baeldung/spring/cloud/TimeSourceApplication.java
similarity index 96%
rename from spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/src/main/java/org/baeldung/spring/cloud/TimeSourceApplication.java
rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/src/main/java/com/baeldung/spring/cloud/TimeSourceApplication.java
index 5bce39ebe0..e731b36e8a 100644
--- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/src/main/java/org/baeldung/spring/cloud/TimeSourceApplication.java
+++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/src/main/java/com/baeldung/spring/cloud/TimeSourceApplication.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring.cloud;
+package com.baeldung.spring.cloud;
import java.util.Date;
diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/src/test/java/com/baeldung/SpringContextTest.java
similarity index 81%
rename from spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/src/test/java/com/baeldung/SpringContextTest.java
index e19b88de90..a850707827 100644
--- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,6 +1,6 @@
-package org.baeldung;
+package com.baeldung;
-import org.baeldung.spring.cloud.TimeSourceApplication;
+import com.baeldung.spring.cloud.TimeSourceApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
diff --git a/spring-cloud/pom.xml b/spring-cloud/pom.xml
index 23ad11b03f..c4e606e190 100644
--- a/spring-cloud/pom.xml
+++ b/spring-cloud/pom.xml
@@ -35,7 +35,7 @@
spring-cloud-archaiusspring-cloud-functionsspring-cloud-vault
-
+ spring-cloud-securityspring-cloud-taskspring-cloud-zuulspring-cloud-zuul-fallback
diff --git a/spring-cloud/spring-cloud-archaius/basic-config/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-archaius/basic-config/src/test/java/com/baeldung/SpringContextTest.java
similarity index 95%
rename from spring-cloud/spring-cloud-archaius/basic-config/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-cloud/spring-cloud-archaius/basic-config/src/test/java/com/baeldung/SpringContextTest.java
index 7674713ff8..3b32f2d9f4 100644
--- a/spring-cloud/spring-cloud-archaius/basic-config/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-archaius/basic-config/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-archaius/extra-configs/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-archaius/extra-configs/src/test/java/com/baeldung/SpringContextTest.java
similarity index 95%
rename from spring-cloud/spring-cloud-archaius/extra-configs/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-cloud/spring-cloud-archaius/extra-configs/src/test/java/com/baeldung/SpringContextTest.java
index a03bd8c23b..21bb7f87a4 100644
--- a/spring-cloud/spring-cloud-archaius/extra-configs/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-archaius/extra-configs/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-bootstrap/config/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-bootstrap/config/src/test/java/com/baeldung/SpringContextTest.java
similarity index 95%
rename from spring-cloud/spring-cloud-bootstrap/config/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-cloud/spring-cloud-bootstrap/config/src/test/java/com/baeldung/SpringContextTest.java
index 98ae3e4895..35691c7aad 100644
--- a/spring-cloud/spring-cloud-bootstrap/config/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-bootstrap/config/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-bootstrap/discovery/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-cloud/spring-cloud-bootstrap/discovery/src/test/java/com/baeldung/SpringContextLiveTest.java
similarity index 96%
rename from spring-cloud/spring-cloud-bootstrap/discovery/src/test/java/org/baeldung/SpringContextLiveTest.java
rename to spring-cloud/spring-cloud-bootstrap/discovery/src/test/java/com/baeldung/SpringContextLiveTest.java
index e4e2e95e04..2e7b52ac68 100644
--- a/spring-cloud/spring-cloud-bootstrap/discovery/src/test/java/org/baeldung/SpringContextLiveTest.java
+++ b/spring-cloud/spring-cloud-bootstrap/discovery/src/test/java/com/baeldung/SpringContextLiveTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/SpringContextLiveTest.java
similarity index 96%
rename from spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/org/baeldung/SpringContextLiveTest.java
rename to spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/SpringContextLiveTest.java
index e0342cf82c..f5c005b11f 100644
--- a/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/org/baeldung/SpringContextLiveTest.java
+++ b/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/SpringContextLiveTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-bootstrap/svc-book/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-cloud/spring-cloud-bootstrap/svc-book/src/test/java/com/baeldung/SpringContextLiveTest.java
similarity index 96%
rename from spring-cloud/spring-cloud-bootstrap/svc-book/src/test/java/org/baeldung/SpringContextLiveTest.java
rename to spring-cloud/spring-cloud-bootstrap/svc-book/src/test/java/com/baeldung/SpringContextLiveTest.java
index 2e437aa3f7..c5bbc74d95 100644
--- a/spring-cloud/spring-cloud-bootstrap/svc-book/src/test/java/org/baeldung/SpringContextLiveTest.java
+++ b/spring-cloud/spring-cloud-bootstrap/svc-book/src/test/java/com/baeldung/SpringContextLiveTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/test/java/com/baeldung/SpringContextLiveTest.java
similarity index 96%
rename from spring-cloud/spring-cloud-bootstrap/svc-rating/src/test/java/org/baeldung/SpringContextLiveTest.java
rename to spring-cloud/spring-cloud-bootstrap/svc-rating/src/test/java/com/baeldung/SpringContextLiveTest.java
index e2921f0308..fbd13720d2 100644
--- a/spring-cloud/spring-cloud-bootstrap/svc-rating/src/test/java/org/baeldung/SpringContextLiveTest.java
+++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/src/test/java/com/baeldung/SpringContextLiveTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-bootstrap/zipkin/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-bootstrap/zipkin/src/test/java/com/baeldung/SpringContextTest.java
similarity index 95%
rename from spring-cloud/spring-cloud-bootstrap/zipkin/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-cloud/spring-cloud-bootstrap/zipkin/src/test/java/com/baeldung/SpringContextTest.java
index 76b7539b6b..71e67df191 100644
--- a/spring-cloud/spring-cloud-bootstrap/zipkin/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-bootstrap/zipkin/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-consul/pom.xml b/spring-cloud/spring-cloud-consul/pom.xml
index b1f6acd9fe..f7f5f84c56 100644
--- a/spring-cloud/spring-cloud-consul/pom.xml
+++ b/spring-cloud/spring-cloud-consul/pom.xml
@@ -2,7 +2,7 @@
4.0.0
- org.baeldung
+ com.baeldungspring-cloud-consulspring-cloud-consuljar
diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/test/java/com/baeldung/SpringContextTest.java
similarity index 95%
rename from spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/test/java/com/baeldung/SpringContextTest.java
index e9098b1467..b491597d0e 100644
--- a/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-contract/spring-cloud-contract-consumer/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/test/java/com/baeldung/SpringContextTest.java
similarity index 95%
rename from spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/test/java/com/baeldung/SpringContextTest.java
index 7d77cbbd7a..9542ddabb9 100644
--- a/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-contract/spring-cloud-contract-producer/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/test/java/com/baeldung/SpringContextTest.java
similarity index 94%
rename from spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/test/java/com/baeldung/SpringContextTest.java
index af59614f7c..8539e2af45 100644
--- a/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/test/java/com/baeldung/SpringContextTest.java
similarity index 95%
rename from spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/test/java/com/baeldung/SpringContextTest.java
index af393cb697..837c24264c 100644
--- a/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/test/java/com/baeldung/SpringContextTest.java
similarity index 95%
rename from spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/test/java/com/baeldung/SpringContextTest.java
index 17cb5a5f39..1bf977a606 100644
--- a/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-rest/pom.xml b/spring-cloud/spring-cloud-rest/pom.xml
index 8677b742de..1136fca020 100644
--- a/spring-cloud/spring-cloud-rest/pom.xml
+++ b/spring-cloud/spring-cloud-rest/pom.xml
@@ -2,7 +2,7 @@
4.0.0
- org.baeldung
+ com.baeldungspring-cloud-rest1.0.0-SNAPSHOTspring-cloud-rest
diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/pom.xml b/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/pom.xml
index b34e325eb8..042f7657ab 100644
--- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/pom.xml
+++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/pom.xml
@@ -2,7 +2,7 @@
4.0.0
- org.baeldung
+ com.baeldungspring-cloud-rest-books-api0.0.1-SNAPSHOTspring-cloud-rest-books-api
diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/main/java/org/baeldung/BooksApiApplication.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/main/java/com/baeldung/BooksApiApplication.java
similarity index 94%
rename from spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/main/java/org/baeldung/BooksApiApplication.java
rename to spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/main/java/com/baeldung/BooksApiApplication.java
index 3a843ba3fb..abcbabe737 100644
--- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/main/java/org/baeldung/BooksApiApplication.java
+++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/main/java/com/baeldung/BooksApiApplication.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/main/java/org/baeldung/SessionConfig.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/main/java/com/baeldung/SessionConfig.java
similarity index 93%
rename from spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/main/java/org/baeldung/SessionConfig.java
rename to spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/main/java/com/baeldung/SessionConfig.java
index bd1c0013ca..6c984fb6d5 100644
--- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/main/java/org/baeldung/SessionConfig.java
+++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/main/java/com/baeldung/SessionConfig.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer;
diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/main/java/org/baeldung/persistence/dao/BookRepository.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/main/java/com/baeldung/persistence/dao/BookRepository.java
similarity index 86%
rename from spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/main/java/org/baeldung/persistence/dao/BookRepository.java
rename to spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/main/java/com/baeldung/persistence/dao/BookRepository.java
index 1b0c32218f..434d4332f7 100644
--- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/main/java/org/baeldung/persistence/dao/BookRepository.java
+++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/main/java/com/baeldung/persistence/dao/BookRepository.java
@@ -1,6 +1,6 @@
-package org.baeldung.persistence.dao;
+package com.baeldung.persistence.dao;
-import org.baeldung.persistence.model.Book;
+import com.baeldung.persistence.model.Book;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.CrudRepository;
diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/main/java/org/baeldung/persistence/model/Book.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/main/java/com/baeldung/persistence/model/Book.java
similarity index 98%
rename from spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/main/java/org/baeldung/persistence/model/Book.java
rename to spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/main/java/com/baeldung/persistence/model/Book.java
index ad5630ea33..26fe3625ec 100644
--- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/main/java/org/baeldung/persistence/model/Book.java
+++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/main/java/com/baeldung/persistence/model/Book.java
@@ -1,4 +1,4 @@
-package org.baeldung.persistence.model;
+package com.baeldung.persistence.model;
import javax.persistence.Column;
import javax.persistence.Entity;
diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/test/java/org/baeldung/BooksApiIntegrationTest.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/test/java/com/baeldung/BooksApiIntegrationTest.java
similarity index 98%
rename from spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/test/java/org/baeldung/BooksApiIntegrationTest.java
rename to spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/test/java/com/baeldung/BooksApiIntegrationTest.java
index 15056e110c..2a90b668cb 100644
--- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/test/java/org/baeldung/BooksApiIntegrationTest.java
+++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/test/java/com/baeldung/BooksApiIntegrationTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/test/java/org/baeldung/RestApiLiveTest.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/test/java/com/baeldung/RestApiLiveTest.java
similarity index 98%
rename from spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/test/java/org/baeldung/RestApiLiveTest.java
rename to spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/test/java/com/baeldung/RestApiLiveTest.java
index 830ec96e08..4184b3aef7 100644
--- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/test/java/org/baeldung/RestApiLiveTest.java
+++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/test/java/com/baeldung/RestApiLiveTest.java
@@ -1,14 +1,16 @@
-package org.baeldung;
+package com.baeldung;
import static io.restassured.RestAssured.preemptive;
import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
import static org.apache.commons.lang3.RandomStringUtils.randomNumeric;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+
+import com.baeldung.BooksApiApplication;
import io.restassured.RestAssured;
import io.restassured.response.Response;
-import org.baeldung.persistence.model.Book;
+import com.baeldung.persistence.model.Book;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/test/java/org/baeldung/SessionLiveTest.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/test/java/com/baeldung/SessionLiveTest.java
similarity index 95%
rename from spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/test/java/org/baeldung/SessionLiveTest.java
rename to spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/test/java/com/baeldung/SessionLiveTest.java
index 3e5fa4f046..9869a650b4 100644
--- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/test/java/org/baeldung/SessionLiveTest.java
+++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/test/java/com/baeldung/SessionLiveTest.java
@@ -1,7 +1,10 @@
-package org.baeldung;
+package com.baeldung;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+
+import com.baeldung.BooksApiApplication;
+import com.baeldung.SessionConfig;
import io.restassured.RestAssured;
import io.restassured.response.Response;
diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/test/java/com/baeldung/SpringContextLiveTest.java
similarity index 89%
rename from spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/test/java/org/baeldung/SpringContextLiveTest.java
rename to spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/test/java/com/baeldung/SpringContextLiveTest.java
index eb56c16c6a..783c2f99c0 100644
--- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/test/java/org/baeldung/SpringContextLiveTest.java
+++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-books-api/src/test/java/com/baeldung/SpringContextLiveTest.java
@@ -1,5 +1,6 @@
-package org.baeldung;
+package com.baeldung;
+import com.baeldung.BooksApiApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server/pom.xml b/spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server/pom.xml
index b3bb6fafdc..5fb9364752 100644
--- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server/pom.xml
+++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server/pom.xml
@@ -2,7 +2,7 @@
4.0.0
- org.baeldung
+ com.baeldungspring-cloud-rest-config-server0.0.1-SNAPSHOTspring-cloud-rest-config-server
diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server/src/main/java/org/baeldung/SpringCloudRestConfigApplication.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server/src/main/java/com/baeldung/SpringCloudRestConfigApplication.java
similarity index 95%
rename from spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server/src/main/java/org/baeldung/SpringCloudRestConfigApplication.java
rename to spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server/src/main/java/com/baeldung/SpringCloudRestConfigApplication.java
index 90c6fe3ec9..d49a21f4ed 100644
--- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server/src/main/java/org/baeldung/SpringCloudRestConfigApplication.java
+++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server/src/main/java/com/baeldung/SpringCloudRestConfigApplication.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server/src/test/java/com/baeldung/SpringContextTest.java
similarity index 94%
rename from spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server/src/test/java/com/baeldung/SpringContextTest.java
index 1b4083e7a6..1548d6a95e 100644
--- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/pom.xml b/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/pom.xml
index aec51ca38a..5e35a7c0f5 100644
--- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/pom.xml
+++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/pom.xml
@@ -2,7 +2,7 @@
4.0.0
- org.baeldung
+ com.baeldungspring-cloud-rest-discovery-server0.0.1-SNAPSHOTspring-cloud-rest-discovery-server
diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/src/main/java/org/baeldung/SessionConfig.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/src/main/java/com/baeldung/SessionConfig.java
similarity index 93%
rename from spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/src/main/java/org/baeldung/SessionConfig.java
rename to spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/src/main/java/com/baeldung/SessionConfig.java
index bd1c0013ca..6c984fb6d5 100644
--- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/src/main/java/org/baeldung/SessionConfig.java
+++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/src/main/java/com/baeldung/SessionConfig.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer;
diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/src/main/java/org/baeldung/SpringCloudRestServerApplication.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/src/main/java/com/baeldung/SpringCloudRestServerApplication.java
similarity index 95%
rename from spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/src/main/java/org/baeldung/SpringCloudRestServerApplication.java
rename to spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/src/main/java/com/baeldung/SpringCloudRestServerApplication.java
index 2845ccf961..1cc0f2982c 100644
--- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/src/main/java/org/baeldung/SpringCloudRestServerApplication.java
+++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/src/main/java/com/baeldung/SpringCloudRestServerApplication.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/src/test/java/org/baeldung/SpringCloudRestServerIntegrationTest.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/src/test/java/com/baeldung/SpringCloudRestServerIntegrationTest.java
similarity index 98%
rename from spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/src/test/java/org/baeldung/SpringCloudRestServerIntegrationTest.java
rename to spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/src/test/java/com/baeldung/SpringCloudRestServerIntegrationTest.java
index 14597d5c2f..1ee895b6b1 100644
--- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/src/test/java/org/baeldung/SpringCloudRestServerIntegrationTest.java
+++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/src/test/java/com/baeldung/SpringCloudRestServerIntegrationTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/src/test/java/com/baeldung/SpringContextLiveTest.java
similarity index 96%
rename from spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/src/test/java/org/baeldung/SpringContextLiveTest.java
rename to spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/src/test/java/com/baeldung/SpringContextLiveTest.java
index 01266a3bda..92acd482cd 100644
--- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/src/test/java/org/baeldung/SpringContextLiveTest.java
+++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-discovery-server/src/test/java/com/baeldung/SpringContextLiveTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/pom.xml b/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/pom.xml
index 161b996496..7503418ad2 100644
--- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/pom.xml
+++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/pom.xml
@@ -2,7 +2,7 @@
4.0.0
- org.baeldung
+ com.baeldungspring-cloud-rest-reviews-api0.0.1-SNAPSHOTspring-cloud-rest-reviews-api
diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/main/java/org/baeldung/BookReviewsApiApplication.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/main/java/com/baeldung/BookReviewsApiApplication.java
similarity index 94%
rename from spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/main/java/org/baeldung/BookReviewsApiApplication.java
rename to spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/main/java/com/baeldung/BookReviewsApiApplication.java
index f3b05e95b1..707c97cb69 100644
--- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/main/java/org/baeldung/BookReviewsApiApplication.java
+++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/main/java/com/baeldung/BookReviewsApiApplication.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/main/java/org/baeldung/SessionConfig.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/main/java/com/baeldung/SessionConfig.java
similarity index 93%
rename from spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/main/java/org/baeldung/SessionConfig.java
rename to spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/main/java/com/baeldung/SessionConfig.java
index bd1c0013ca..6c984fb6d5 100644
--- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/main/java/org/baeldung/SessionConfig.java
+++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/main/java/com/baeldung/SessionConfig.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer;
diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/main/java/org/baeldung/persistence/dao/BookReviewRepository.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/main/java/com/baeldung/persistence/dao/BookReviewRepository.java
similarity index 85%
rename from spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/main/java/org/baeldung/persistence/dao/BookReviewRepository.java
rename to spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/main/java/com/baeldung/persistence/dao/BookReviewRepository.java
index 2107786d62..1f29b66867 100644
--- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/main/java/org/baeldung/persistence/dao/BookReviewRepository.java
+++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/main/java/com/baeldung/persistence/dao/BookReviewRepository.java
@@ -1,6 +1,6 @@
-package org.baeldung.persistence.dao;
+package com.baeldung.persistence.dao;
-import org.baeldung.persistence.model.BookReview;
+import com.baeldung.persistence.model.BookReview;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.CrudRepository;
diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/main/java/org/baeldung/persistence/model/BookReview.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/main/java/com/baeldung/persistence/model/BookReview.java
similarity index 98%
rename from spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/main/java/org/baeldung/persistence/model/BookReview.java
rename to spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/main/java/com/baeldung/persistence/model/BookReview.java
index d8d6aa4fef..4b6ff7f32b 100644
--- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/main/java/org/baeldung/persistence/model/BookReview.java
+++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/main/java/com/baeldung/persistence/model/BookReview.java
@@ -1,4 +1,4 @@
-package org.baeldung.persistence.model;
+package com.baeldung.persistence.model;
import javax.persistence.Column;
import javax.persistence.Entity;
diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/test/java/org/baeldung/BookReviewsApiIntegrationTest.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/test/java/com/baeldung/BookReviewsApiIntegrationTest.java
similarity index 98%
rename from spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/test/java/org/baeldung/BookReviewsApiIntegrationTest.java
rename to spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/test/java/com/baeldung/BookReviewsApiIntegrationTest.java
index c63b4ebb08..7d7867f9ac 100644
--- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/test/java/org/baeldung/BookReviewsApiIntegrationTest.java
+++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/test/java/com/baeldung/BookReviewsApiIntegrationTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/test/java/org/baeldung/RestApiLiveTest.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/test/java/com/baeldung/RestApiLiveTest.java
similarity index 97%
rename from spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/test/java/org/baeldung/RestApiLiveTest.java
rename to spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/test/java/com/baeldung/RestApiLiveTest.java
index 91f76d386a..88f845adcc 100644
--- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/test/java/org/baeldung/RestApiLiveTest.java
+++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/test/java/com/baeldung/RestApiLiveTest.java
@@ -1,14 +1,16 @@
-package org.baeldung;
+package com.baeldung;
import static io.restassured.RestAssured.preemptive;
import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
import static org.apache.commons.lang3.RandomStringUtils.randomNumeric;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+
+import com.baeldung.BookReviewsApiApplication;
import io.restassured.RestAssured;
import io.restassured.response.Response;
-import org.baeldung.persistence.model.BookReview;
+import com.baeldung.persistence.model.BookReview;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/test/java/com/baeldung/SpringContextLiveTest.java
similarity index 88%
rename from spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/test/java/org/baeldung/SpringContextLiveTest.java
rename to spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/test/java/com/baeldung/SpringContextLiveTest.java
index 070abd246f..6bb75ed1eb 100644
--- a/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/test/java/org/baeldung/SpringContextLiveTest.java
+++ b/spring-cloud/spring-cloud-rest/spring-cloud-rest-reviews-api/src/test/java/com/baeldung/SpringContextLiveTest.java
@@ -1,5 +1,6 @@
-package org.baeldung;
+package com.baeldung;
+import com.baeldung.BookReviewsApiApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
diff --git a/spring-cloud/spring-cloud-ribbon-client/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-ribbon-client/src/test/java/com/baeldung/SpringContextTest.java
similarity index 95%
rename from spring-cloud/spring-cloud-ribbon-client/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-cloud/spring-cloud-ribbon-client/src/test/java/com/baeldung/SpringContextTest.java
index 23dbcf8ff6..949718e627 100644
--- a/spring-cloud/spring-cloud-ribbon-client/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-ribbon-client/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-security/auth-client/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-security/auth-client/src/test/java/com/baeldung/SpringContextTest.java
similarity index 94%
rename from spring-cloud/spring-cloud-security/auth-client/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-cloud/spring-cloud-security/auth-client/src/test/java/com/baeldung/SpringContextTest.java
index 02c429acf5..33e5530667 100644
--- a/spring-cloud/spring-cloud-security/auth-client/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-security/auth-client/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-security/auth-client/src/test/java/com/example/springoath2/Springoath2ApplicationIntegrationTest.java b/spring-cloud/spring-cloud-security/auth-client/src/test/java/com/baeldung/example/springoath2/Springoath2ApplicationIntegrationTest.java
similarity index 90%
rename from spring-cloud/spring-cloud-security/auth-client/src/test/java/com/example/springoath2/Springoath2ApplicationIntegrationTest.java
rename to spring-cloud/spring-cloud-security/auth-client/src/test/java/com/baeldung/example/springoath2/Springoath2ApplicationIntegrationTest.java
index 37cff095db..1c5198125e 100644
--- a/spring-cloud/spring-cloud-security/auth-client/src/test/java/com/example/springoath2/Springoath2ApplicationIntegrationTest.java
+++ b/spring-cloud/spring-cloud-security/auth-client/src/test/java/com/baeldung/example/springoath2/Springoath2ApplicationIntegrationTest.java
@@ -1,4 +1,4 @@
-package com.example.springoath2;
+package com.baeldung.example.springoath2;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-security/auth-resource/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-security/auth-resource/src/test/java/com/baeldung/SpringContextTest.java
similarity index 94%
rename from spring-cloud/spring-cloud-security/auth-resource/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-cloud/spring-cloud-security/auth-resource/src/test/java/com/baeldung/SpringContextTest.java
index a061928bf5..cce93f2c3e 100644
--- a/spring-cloud/spring-cloud-security/auth-resource/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-security/auth-resource/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-security/auth-server/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-security/auth-server/src/test/java/com/baeldung/SpringContextTest.java
similarity index 94%
rename from spring-cloud/spring-cloud-security/auth-server/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-cloud/spring-cloud-security/auth-server/src/test/java/com/baeldung/SpringContextTest.java
index aec56a574c..d61a9c279f 100644
--- a/spring-cloud/spring-cloud-security/auth-server/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-security/auth-server/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-stream/pom.xml b/spring-cloud/spring-cloud-stream/pom.xml
index df17b778da..ebaaab0801 100644
--- a/spring-cloud/spring-cloud-stream/pom.xml
+++ b/spring-cloud/spring-cloud-stream/pom.xml
@@ -2,7 +2,7 @@
4.0.0
- org.baeldung
+ com.baeldungspring-cloud-streamspring-cloud-streampom
diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/pom.xml b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/pom.xml
index 4273bd8701..4aa42f03d7 100644
--- a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/pom.xml
+++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/pom.xml
@@ -8,7 +8,7 @@
Simple Spring Cloud Stream
- org.baeldung
+ com.baeldungspring-cloud-stream1.0.0-SNAPSHOT..
diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/SpringContextTest.java
similarity index 95%
rename from spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/SpringContextTest.java
index 0f3b8de901..c74013f1a6 100644
--- a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml b/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml
index be920bb93d..fd10322efb 100644
--- a/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml
+++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml
@@ -3,7 +3,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
- org.baeldung.cloud
+ com.baeldung.cloudspringcloudtaskbatchspringcloudtaskbatch
diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/com/baeldung/SpringContextTest.java
similarity index 97%
rename from spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/com/baeldung/SpringContextTest.java
index 3dd350b571..32224bf91b 100644
--- a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-task/springcloudtasksink/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-task/springcloudtasksink/src/test/java/com/baeldung/SpringContextTest.java
similarity index 95%
rename from spring-cloud/spring-cloud-task/springcloudtasksink/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-cloud/spring-cloud-task/springcloudtasksink/src/test/java/com/baeldung/SpringContextTest.java
index 51f0926429..35c36bbb82 100644
--- a/spring-cloud/spring-cloud-task/springcloudtasksink/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-task/springcloudtasksink/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-cloud/spring-cloud-vault/pom.xml b/spring-cloud/spring-cloud-vault/pom.xml
index cbb32ac937..dbdbcb2c50 100644
--- a/spring-cloud/spring-cloud-vault/pom.xml
+++ b/spring-cloud/spring-cloud-vault/pom.xml
@@ -2,7 +2,7 @@
4.0.0
- org.baeldung.spring.cloud
+ com.baeldung.spring.cloudspring-cloud-vaultspring-cloud-vaultjar
diff --git a/spring-cloud/spring-cloud-vault/src/main/java/org/baeldung/spring/cloud/vaultsample/AccountRepo.java b/spring-cloud/spring-cloud-vault/src/main/java/com/baeldung/spring/cloud/vaultsample/AccountRepo.java
similarity index 64%
rename from spring-cloud/spring-cloud-vault/src/main/java/org/baeldung/spring/cloud/vaultsample/AccountRepo.java
rename to spring-cloud/spring-cloud-vault/src/main/java/com/baeldung/spring/cloud/vaultsample/AccountRepo.java
index 318cc84957..700334946d 100644
--- a/spring-cloud/spring-cloud-vault/src/main/java/org/baeldung/spring/cloud/vaultsample/AccountRepo.java
+++ b/spring-cloud/spring-cloud-vault/src/main/java/com/baeldung/spring/cloud/vaultsample/AccountRepo.java
@@ -1,6 +1,6 @@
-package org.baeldung.spring.cloud.vaultsample;
+package com.baeldung.spring.cloud.vaultsample;
-import org.baeldung.spring.cloud.vaultsample.domain.Account;
+import com.baeldung.spring.cloud.vaultsample.domain.Account;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
diff --git a/spring-cloud/spring-cloud-vault/src/main/java/org/baeldung/spring/cloud/vaultsample/AccountResource.java b/spring-cloud/spring-cloud-vault/src/main/java/com/baeldung/spring/cloud/vaultsample/AccountResource.java
similarity index 88%
rename from spring-cloud/spring-cloud-vault/src/main/java/org/baeldung/spring/cloud/vaultsample/AccountResource.java
rename to spring-cloud/spring-cloud-vault/src/main/java/com/baeldung/spring/cloud/vaultsample/AccountResource.java
index 8fcaa9e2aa..34147d3719 100644
--- a/spring-cloud/spring-cloud-vault/src/main/java/org/baeldung/spring/cloud/vaultsample/AccountResource.java
+++ b/spring-cloud/spring-cloud-vault/src/main/java/com/baeldung/spring/cloud/vaultsample/AccountResource.java
@@ -1,6 +1,6 @@
-package org.baeldung.spring.cloud.vaultsample;
+package com.baeldung.spring.cloud.vaultsample;
-import org.baeldung.spring.cloud.vaultsample.domain.Account;
+import com.baeldung.spring.cloud.vaultsample.domain.Account;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
diff --git a/spring-cloud/spring-cloud-vault/src/main/java/org/baeldung/spring/cloud/vaultsample/SecretResource.java b/spring-cloud/spring-cloud-vault/src/main/java/com/baeldung/spring/cloud/vaultsample/SecretResource.java
similarity index 95%
rename from spring-cloud/spring-cloud-vault/src/main/java/org/baeldung/spring/cloud/vaultsample/SecretResource.java
rename to spring-cloud/spring-cloud-vault/src/main/java/com/baeldung/spring/cloud/vaultsample/SecretResource.java
index c4579da045..9f51a4512f 100644
--- a/spring-cloud/spring-cloud-vault/src/main/java/org/baeldung/spring/cloud/vaultsample/SecretResource.java
+++ b/spring-cloud/spring-cloud-vault/src/main/java/com/baeldung/spring/cloud/vaultsample/SecretResource.java
@@ -1,7 +1,7 @@
/**
*
*/
-package org.baeldung.spring.cloud.vaultsample;
+package com.baeldung.spring.cloud.vaultsample;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/spring-cloud/spring-cloud-vault/src/main/java/org/baeldung/spring/cloud/vaultsample/VaultSampleApplication.java b/spring-cloud/spring-cloud-vault/src/main/java/com/baeldung/spring/cloud/vaultsample/VaultSampleApplication.java
similarity index 86%
rename from spring-cloud/spring-cloud-vault/src/main/java/org/baeldung/spring/cloud/vaultsample/VaultSampleApplication.java
rename to spring-cloud/spring-cloud-vault/src/main/java/com/baeldung/spring/cloud/vaultsample/VaultSampleApplication.java
index 81ece1ca4c..450aa41f7a 100644
--- a/spring-cloud/spring-cloud-vault/src/main/java/org/baeldung/spring/cloud/vaultsample/VaultSampleApplication.java
+++ b/spring-cloud/spring-cloud-vault/src/main/java/com/baeldung/spring/cloud/vaultsample/VaultSampleApplication.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring.cloud.vaultsample;
+package com.baeldung.spring.cloud.vaultsample;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-cloud/spring-cloud-vault/src/main/java/org/baeldung/spring/cloud/vaultsample/domain/Account.java b/spring-cloud/spring-cloud-vault/src/main/java/com/baeldung/spring/cloud/vaultsample/domain/Account.java
similarity index 98%
rename from spring-cloud/spring-cloud-vault/src/main/java/org/baeldung/spring/cloud/vaultsample/domain/Account.java
rename to spring-cloud/spring-cloud-vault/src/main/java/com/baeldung/spring/cloud/vaultsample/domain/Account.java
index df4778831b..577b108cfd 100644
--- a/spring-cloud/spring-cloud-vault/src/main/java/org/baeldung/spring/cloud/vaultsample/domain/Account.java
+++ b/spring-cloud/spring-cloud-vault/src/main/java/com/baeldung/spring/cloud/vaultsample/domain/Account.java
@@ -1,7 +1,7 @@
/**
*
*/
-package org.baeldung.spring.cloud.vaultsample.domain;
+package com.baeldung.spring.cloud.vaultsample.domain;
import javax.persistence.Entity;
import javax.persistence.Id;
diff --git a/spring-cloud/spring-cloud-vault/src/test/java/org/baeldung/spring/cloud/vaultsample/SpringContextLiveTest.java b/spring-cloud/spring-cloud-vault/src/test/java/com/baeldung/spring/cloud/vaultsample/SpringContextLiveTest.java
similarity index 83%
rename from spring-cloud/spring-cloud-vault/src/test/java/org/baeldung/spring/cloud/vaultsample/SpringContextLiveTest.java
rename to spring-cloud/spring-cloud-vault/src/test/java/com/baeldung/spring/cloud/vaultsample/SpringContextLiveTest.java
index 82fe3d7a4a..0cf88fe712 100644
--- a/spring-cloud/spring-cloud-vault/src/test/java/org/baeldung/spring/cloud/vaultsample/SpringContextLiveTest.java
+++ b/spring-cloud/spring-cloud-vault/src/test/java/com/baeldung/spring/cloud/vaultsample/SpringContextLiveTest.java
@@ -1,5 +1,6 @@
-package org.baeldung.spring.cloud.vaultsample;
+package com.baeldung.spring.cloud.vaultsample;
+import com.baeldung.spring.cloud.vaultsample.VaultSampleApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
diff --git a/spring-cloud/spring-cloud-vault/src/test/java/org/baeldung/spring/cloud/vaultsample/VaultSampleApplicationLiveTest.java b/spring-cloud/spring-cloud-vault/src/test/java/com/baeldung/spring/cloud/vaultsample/VaultSampleApplicationLiveTest.java
similarity index 96%
rename from spring-cloud/spring-cloud-vault/src/test/java/org/baeldung/spring/cloud/vaultsample/VaultSampleApplicationLiveTest.java
rename to spring-cloud/spring-cloud-vault/src/test/java/com/baeldung/spring/cloud/vaultsample/VaultSampleApplicationLiveTest.java
index 7a9c5ba11a..22f7f8e168 100644
--- a/spring-cloud/spring-cloud-vault/src/test/java/org/baeldung/spring/cloud/vaultsample/VaultSampleApplicationLiveTest.java
+++ b/spring-cloud/spring-cloud-vault/src/test/java/com/baeldung/spring/cloud/vaultsample/VaultSampleApplicationLiveTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring.cloud.vaultsample;
+package com.baeldung.spring.cloud.vaultsample;
import static org.junit.Assert.assertEquals;
diff --git a/spring-cloud/spring-cloud-zookeeper/Greeting/pom.xml b/spring-cloud/spring-cloud-zookeeper/Greeting/pom.xml
index b0ee448e87..ac469d8bc4 100644
--- a/spring-cloud/spring-cloud-zookeeper/Greeting/pom.xml
+++ b/spring-cloud/spring-cloud-zookeeper/Greeting/pom.xml
@@ -56,17 +56,23 @@
spring-cloud-starter-feign${spring-cloud-starter-feign.version}
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ ${spring-boot.version}
+ org.hamcresthamcrest-core
- ${hamcrest.version}
+ ${hamcrest-core.version}test1.2.5.RELEASE
- 1.3
+ 1.3
-
\ No newline at end of file
+
diff --git a/spring-cloud/spring-cloud-zookeeper/Greeting/src/test/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-zookeeper/Greeting/src/test/java/com/baeldung/SpringContextTest.java
similarity index 81%
rename from spring-cloud/spring-cloud-zookeeper/Greeting/src/test/baeldung/SpringContextTest.java
rename to spring-cloud/spring-cloud-zookeeper/Greeting/src/test/java/com/baeldung/SpringContextTest.java
index b45e7b9889..f7325e425f 100644
--- a/spring-cloud/spring-cloud-zookeeper/Greeting/src/test/baeldung/SpringContextTest.java
+++ b/spring-cloud/spring-cloud-zookeeper/Greeting/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,12 +1,11 @@
-package org.baeldung;
+package com.baeldung;
+import com.baeldung.spring.cloud.greeting.GreetingApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
-import com.baeldung.spring.cloud.ribbon.client.ServerLocationApp;
-
@RunWith(SpringRunner.class)
@SpringBootTest(classes = GreetingApplication.class)
public class SpringContextTest {
diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/java/com/baeldung/filters/ResponseLogFilter.java b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/java/com/baeldung/filters/ResponseLogFilter.java
index 1fdd89c7f7..b0e4f7e313 100644
--- a/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/java/com/baeldung/filters/ResponseLogFilter.java
+++ b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/java/com/baeldung/filters/ResponseLogFilter.java
@@ -12,6 +12,7 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.POST_TYPE;
+import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR;
@Component
public class ResponseLogFilter extends ZuulFilter {
@@ -50,7 +51,7 @@ public class ResponseLogFilter extends ZuulFilter {
context.setResponseBody(responseData);
}
catch (Exception e) {
- logger.error("error occurred at response log filter", e);
+ throw new ZuulException(e, INTERNAL_SERVER_ERROR.value(), e.getMessage());
}
return null;
diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-ui/pom.xml b/spring-cloud/spring-cloud-zuul/spring-zuul-ui/pom.xml
index 09c94663b1..7978d9c77b 100644
--- a/spring-cloud/spring-cloud-zuul/spring-zuul-ui/pom.xml
+++ b/spring-cloud/spring-cloud-zuul/spring-zuul-ui/pom.xml
@@ -24,12 +24,7 @@
org.hamcrest
- hamcrest-core
- test
-
-
- org.hamcrest
- hamcrest-library
+ hamcresttest
diff --git a/spring-core-2/pom.xml b/spring-core-2/pom.xml
index 4d474d8b2c..edbb351bd0 100644
--- a/spring-core-2/pom.xml
+++ b/spring-core-2/pom.xml
@@ -135,12 +135,7 @@
org.hamcrest
- hamcrest-core
- test
-
-
- org.hamcrest
- hamcrest-library
+ hamcresttest
diff --git a/spring-core-3/pom.xml b/spring-core-3/pom.xml
index cd82f23320..205259e8e4 100644
--- a/spring-core-3/pom.xml
+++ b/spring-core-3/pom.xml
@@ -1,72 +1,88 @@
-
-
- 4.0.0
- spring-core-3
- spring-core-3
-
-
- com.baeldung
- parent-spring-5
- 0.0.1-SNAPSHOT
- ../parent-spring-5
-
-
-
-
- org.springframework
- spring-beans
- ${spring.version}
-
-
- org.springframework
- spring-context
- ${spring.version}
-
-
- org.springframework
- spring-core
- ${spring.version}
-
-
- javax.annotation
- javax.annotation-api
- ${annotation-api.version}
-
-
- org.springframework
- spring-test
- ${spring.version}
- test
-
-
- org.junit.jupiter
- junit-jupiter-engine
- ${junit-jupiter.version}
- test
-
-
- org.junit.jupiter
- junit-jupiter-api
- ${junit-jupiter.version}
- test
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- ${maven.surefire.version}
-
-
-
-
-
- 2.22.1
- 1.3.2
-
-
+
+
+ 4.0.0
+ spring-core-3
+ spring-core-3
+
+
+ com.baeldung
+ parent-spring-5
+ 0.0.1-SNAPSHOT
+ ../parent-spring-5
+
+
+
+
+ org.springframework
+ spring-beans
+ ${spring.version}
+
+
+ org.springframework
+ spring-tx
+ ${spring.version}
+
+
+ org.springframework
+ spring-jdbc
+ ${spring.version}
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ ${spring.boot.version}
+
+
+ org.springframework
+ spring-context
+ ${spring.version}
+
+
+ org.springframework
+ spring-core
+ ${spring.version}
+
+
+ javax.annotation
+ javax.annotation-api
+ ${annotation-api.version}
+
+
+ org.springframework
+ spring-test
+ ${spring.version}
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ ${junit-jupiter.version}
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ ${junit-jupiter.version}
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven.surefire.version}
+
+
+
+
+
+ 2.22.1
+ 1.3.2
+ 2.2.2.RELEASE
+
+
\ No newline at end of file
diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/Application.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/Application.java
new file mode 100644
index 0000000000..8f0134d83c
--- /dev/null
+++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/Application.java
@@ -0,0 +1,19 @@
+package com.baeldung.spring.patterns.factory;
+
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+
+public class Application {
+
+ @SuppressWarnings("resource")
+ public static void main(String[] args) {
+
+ ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
+
+ Foo foo = context.getBean(Foo.class);
+ Bar bar = context.getBean(Bar.class, "Some name");
+
+ System.out.println(foo);
+ System.out.println("Bar's name: " + bar.getName());
+ }
+}
diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/ApplicationConfig.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/ApplicationConfig.java
new file mode 100644
index 0000000000..626947cfd5
--- /dev/null
+++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/ApplicationConfig.java
@@ -0,0 +1,9 @@
+package com.baeldung.spring.patterns.factory;
+
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ComponentScan(basePackageClasses = ApplicationConfig.class)
+public class ApplicationConfig {
+}
diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/Bar.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/Bar.java
new file mode 100644
index 0000000000..8bd742c481
--- /dev/null
+++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/Bar.java
@@ -0,0 +1,20 @@
+package com.baeldung.spring.patterns.factory;
+
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+@Component
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class Bar {
+
+ private String name;
+
+ public Bar(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+}
diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/Foo.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/Foo.java
new file mode 100644
index 0000000000..5edba6c50d
--- /dev/null
+++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/factory/Foo.java
@@ -0,0 +1,7 @@
+package com.baeldung.spring.patterns.factory;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class Foo {
+}
diff --git a/intelliJ/remote-debugging/src/main/java/hello/Application.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/Application.java
similarity index 60%
rename from intelliJ/remote-debugging/src/main/java/hello/Application.java
rename to spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/Application.java
index 73b55f933b..d00f51ec96 100644
--- a/intelliJ/remote-debugging/src/main/java/hello/Application.java
+++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/Application.java
@@ -1,14 +1,12 @@
-package hello;
+package com.baeldung.spring.patterns.proxy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
-@EnableScheduling
public class Application {
public static void main(String[] args) {
- SpringApplication.run(Application.class);
+ SpringApplication.run(Application.class, args);
}
}
diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/Book.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/Book.java
new file mode 100644
index 0000000000..112396e232
--- /dev/null
+++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/Book.java
@@ -0,0 +1,18 @@
+package com.baeldung.spring.patterns.proxy;
+
+public class Book {
+
+ private String author;
+
+ public Book(String author) {
+ this.author = author;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+}
diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/BookController.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/BookController.java
new file mode 100644
index 0000000000..ab192826b8
--- /dev/null
+++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/BookController.java
@@ -0,0 +1,18 @@
+package com.baeldung.spring.patterns.proxy;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class BookController {
+
+ @Autowired
+ private BookManager manager;
+
+ @PostMapping("/book")
+ public Book create(@RequestParam String author) {
+ return manager.create(author);
+ }
+}
diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/BookManager.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/BookManager.java
new file mode 100644
index 0000000000..d82218e404
--- /dev/null
+++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/BookManager.java
@@ -0,0 +1,18 @@
+package com.baeldung.spring.patterns.proxy;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+public class BookManager {
+
+ @Autowired
+ private BookRepository repository;
+
+ @Transactional
+ public Book create(String author) {
+ System.out.println(repository.getClass().getName());
+ return repository.create(author);
+ }
+}
diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/BookRepository.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/BookRepository.java
new file mode 100644
index 0000000000..b100bc0a61
--- /dev/null
+++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/proxy/BookRepository.java
@@ -0,0 +1,11 @@
+package com.baeldung.spring.patterns.proxy;
+
+import org.springframework.stereotype.Repository;
+
+@Repository
+public class BookRepository {
+
+ public Book create(String author) {
+ return new Book(author);
+ }
+}
diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/Application.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/Application.java
new file mode 100644
index 0000000000..5d7545790a
--- /dev/null
+++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/Application.java
@@ -0,0 +1,12 @@
+package com.baeldung.spring.patterns.singleton;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+}
diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/Book.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/Book.java
new file mode 100644
index 0000000000..31d9d83683
--- /dev/null
+++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/Book.java
@@ -0,0 +1,4 @@
+package com.baeldung.spring.patterns.singleton;
+
+public class Book {
+}
diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/BookController.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/BookController.java
new file mode 100644
index 0000000000..aa4bdb8371
--- /dev/null
+++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/BookController.java
@@ -0,0 +1,19 @@
+package com.baeldung.spring.patterns.singleton;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class BookController {
+
+ @Autowired
+ private BookRepository repository;
+
+ @GetMapping("/book/{id}")
+ public Book findById(@PathVariable long id) {
+ System.out.println(repository);
+ return repository.findById(id).get();
+ }
+}
diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/BookRepository.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/BookRepository.java
new file mode 100644
index 0000000000..3fde153f31
--- /dev/null
+++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/BookRepository.java
@@ -0,0 +1,17 @@
+package com.baeldung.spring.patterns.singleton;
+
+import java.util.Optional;
+
+import org.springframework.stereotype.Repository;
+
+@Repository
+public class BookRepository {
+
+ public long count() {
+ return 1;
+ }
+
+ public Optional findById(long id) {
+ return Optional.of(new Book());
+ }
+}
diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/LibraryController.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/LibraryController.java
new file mode 100644
index 0000000000..76e273e2fb
--- /dev/null
+++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/singleton/LibraryController.java
@@ -0,0 +1,18 @@
+package com.baeldung.spring.patterns.singleton;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class LibraryController {
+
+ @Autowired
+ private BookRepository repository;
+
+ @GetMapping("/count")
+ public Long findCount() {
+ System.out.println(repository);
+ return repository.count();
+ }
+}
diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/template/Book.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/template/Book.java
new file mode 100644
index 0000000000..d601f01c67
--- /dev/null
+++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/template/Book.java
@@ -0,0 +1,32 @@
+package com.baeldung.spring.patterns.template;
+
+public class Book {
+
+ private long id;
+ private String title;
+ private String author;
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+}
diff --git a/spring-core-3/src/main/java/com/baeldung/spring/patterns/template/BookRowMapper.java b/spring-core-3/src/main/java/com/baeldung/spring/patterns/template/BookRowMapper.java
new file mode 100644
index 0000000000..3fe7bb8e59
--- /dev/null
+++ b/spring-core-3/src/main/java/com/baeldung/spring/patterns/template/BookRowMapper.java
@@ -0,0 +1,21 @@
+package com.baeldung.spring.patterns.template;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import org.springframework.jdbc.core.RowMapper;
+
+public class BookRowMapper implements RowMapper {
+
+ @Override
+ public Book mapRow(ResultSet rs, int rowNum) throws SQLException {
+
+ Book book = new Book();
+
+ book.setId(rs.getLong("id"));
+ book.setTitle(rs.getString("title"));
+ book.setAuthor(rs.getString("author"));
+
+ return book;
+ }
+}
diff --git a/spring-core-3/src/test/java/com/baeldung/spring/patterns/factory/AnnotationConfigApplicationContextUnitTest.java b/spring-core-3/src/test/java/com/baeldung/spring/patterns/factory/AnnotationConfigApplicationContextUnitTest.java
new file mode 100644
index 0000000000..66e01f261f
--- /dev/null
+++ b/spring-core-3/src/test/java/com/baeldung/spring/patterns/factory/AnnotationConfigApplicationContextUnitTest.java
@@ -0,0 +1,36 @@
+package com.baeldung.spring.patterns.factory;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+
+public class AnnotationConfigApplicationContextUnitTest {
+
+ @Test
+ @SuppressWarnings("resource")
+ public void whenGetSimpleBean_thenReturnConstructedBean() {
+
+ ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
+
+ Foo foo = context.getBean(Foo.class);
+
+ assertNotNull(foo);
+ }
+
+ @Test
+ @SuppressWarnings("resource")
+ public void whenGetPrototypeBean_thenReturnConstructedBean() {
+
+ String expectedName = "Some name";
+ ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
+
+ Bar bar = context.getBean(Bar.class, expectedName);
+
+ assertNotNull(bar);
+ assertThat(bar.getName(), is(expectedName));
+ }
+}
diff --git a/spring-core-3/src/test/java/com/baeldung/spring/patterns/factory/ApplicationConfig.java b/spring-core-3/src/test/java/com/baeldung/spring/patterns/factory/ApplicationConfig.java
new file mode 100644
index 0000000000..626947cfd5
--- /dev/null
+++ b/spring-core-3/src/test/java/com/baeldung/spring/patterns/factory/ApplicationConfig.java
@@ -0,0 +1,9 @@
+package com.baeldung.spring.patterns.factory;
+
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ComponentScan(basePackageClasses = ApplicationConfig.class)
+public class ApplicationConfig {
+}
diff --git a/spring-core-3/src/test/java/com/baeldung/spring/patterns/factory/Bar.java b/spring-core-3/src/test/java/com/baeldung/spring/patterns/factory/Bar.java
new file mode 100644
index 0000000000..e2f825aab3
--- /dev/null
+++ b/spring-core-3/src/test/java/com/baeldung/spring/patterns/factory/Bar.java
@@ -0,0 +1,20 @@
+package com.baeldung.spring.patterns.factory;
+
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+@Component
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class Bar {
+
+ private String name;
+
+ public Bar(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+}
\ No newline at end of file
diff --git a/spring-core-3/src/test/java/com/baeldung/spring/patterns/factory/ClassPathXmlApplicationContextUnitTest.java b/spring-core-3/src/test/java/com/baeldung/spring/patterns/factory/ClassPathXmlApplicationContextUnitTest.java
new file mode 100644
index 0000000000..bb9988317e
--- /dev/null
+++ b/spring-core-3/src/test/java/com/baeldung/spring/patterns/factory/ClassPathXmlApplicationContextUnitTest.java
@@ -0,0 +1,36 @@
+package com.baeldung.spring.patterns.factory;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+public class ClassPathXmlApplicationContextUnitTest {
+
+ @Test
+ @SuppressWarnings("resource")
+ public void givenXmlConfiguration_whenGetSimpleBean_thenReturnConstructedBean() {
+
+ ApplicationContext context = new ClassPathXmlApplicationContext("patterns-context.xml");
+
+ Foo foo = context.getBean(Foo.class);
+
+ assertNotNull(foo);
+ }
+
+ @Test
+ @SuppressWarnings("resource")
+ public void givenXmlConfiguration_whenGetPrototypeBean_thenReturnConstructedBean() {
+
+ String expectedName = "Some name";
+ ApplicationContext context = new ClassPathXmlApplicationContext("patterns-context.xml");
+
+ Bar bar = context.getBean(Bar.class, expectedName);
+
+ assertNotNull(bar);
+ assertThat(bar.getName(), is(expectedName));
+ }
+}
diff --git a/spring-core-3/src/test/java/com/baeldung/spring/patterns/factory/Foo.java b/spring-core-3/src/test/java/com/baeldung/spring/patterns/factory/Foo.java
new file mode 100644
index 0000000000..5edba6c50d
--- /dev/null
+++ b/spring-core-3/src/test/java/com/baeldung/spring/patterns/factory/Foo.java
@@ -0,0 +1,7 @@
+package com.baeldung.spring.patterns.factory;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class Foo {
+}
diff --git a/spring-core-3/src/test/resources/patterns-context.xml b/spring-core-3/src/test/resources/patterns-context.xml
new file mode 100644
index 0000000000..106cde79a0
--- /dev/null
+++ b/spring-core-3/src/test/resources/patterns-context.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-core-3/static-value-injection/README.md b/spring-core-3/static-value-injection/README.md
new file mode 100644
index 0000000000..06dfa29f80
--- /dev/null
+++ b/spring-core-3/static-value-injection/README.md
@@ -0,0 +1,22 @@
+# Inject a value to a static field
+
+## How to run
+```sh
+mvn clean install
+mvn spring-boot:run
+```
+
+## Request
+
+**GET**
+http://localhost:8080/properties
+
+
+## Response
+```json
+[
+ "Inject a value to a static field",
+ "Inject a value to a static field",
+ null
+]
+```
diff --git a/spring-core-3/static-value-injection/pom.xml b/spring-core-3/static-value-injection/pom.xml
new file mode 100644
index 0000000000..aa45fde886
--- /dev/null
+++ b/spring-core-3/static-value-injection/pom.xml
@@ -0,0 +1,52 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.4.RELEASE
+
+
+ com.baeldung
+ static.value.injection
+ 0.0.1-SNAPSHOT
+ static.value.injection
+ Demo project for Spring Boot
+
+
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.junit.vintage
+ junit-vintage-engine
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/spring-core-3/static-value-injection/src/main/java/com/baeldung/Application.java b/spring-core-3/static-value-injection/src/main/java/com/baeldung/Application.java
new file mode 100644
index 0000000000..c1875216b5
--- /dev/null
+++ b/spring-core-3/static-value-injection/src/main/java/com/baeldung/Application.java
@@ -0,0 +1,13 @@
+package com.baeldung;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
diff --git a/spring-core-3/static-value-injection/src/main/java/com/baeldung/controller/PropertyController.java b/spring-core-3/static-value-injection/src/main/java/com/baeldung/controller/PropertyController.java
new file mode 100644
index 0000000000..03a2518117
--- /dev/null
+++ b/spring-core-3/static-value-injection/src/main/java/com/baeldung/controller/PropertyController.java
@@ -0,0 +1,31 @@
+package com.baeldung.controller;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Arrays;
+import java.util.List;
+
+@RestController
+public class PropertyController {
+
+ @Value("${name}")
+ private String name;
+
+ @Value("${name}")
+ private static String NAME_NULL;
+
+ private static String NAME_STATIC;
+
+ @Value("${name}")
+ public void setNameStatic(String name){
+ PropertyController.NAME_STATIC = name;
+ }
+
+ @GetMapping("/properties")
+ public List getProperties(){
+ return Arrays.asList(this.name, NAME_STATIC, NAME_NULL) ;
+ }
+}
diff --git a/spring-core-3/static-value-injection/src/main/resources/application.properties b/spring-core-3/static-value-injection/src/main/resources/application.properties
new file mode 100644
index 0000000000..828fa9cd2a
--- /dev/null
+++ b/spring-core-3/static-value-injection/src/main/resources/application.properties
@@ -0,0 +1 @@
+name = Inject a value to a static field
diff --git a/spring-core-3/static-value-injection/src/test/java/com/baeldung/ApplicationTests.java b/spring-core-3/static-value-injection/src/test/java/com/baeldung/ApplicationTests.java
new file mode 100644
index 0000000000..4ad83bc539
--- /dev/null
+++ b/spring-core-3/static-value-injection/src/test/java/com/baeldung/ApplicationTests.java
@@ -0,0 +1,13 @@
+package com.baeldung;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class ApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}
diff --git a/spring-ejb/ejb-beans/pom.xml b/spring-ejb/ejb-beans/pom.xml
index b8978a0cc3..eecf8c1d23 100644
--- a/spring-ejb/ejb-beans/pom.xml
+++ b/spring-ejb/ejb-beans/pom.xml
@@ -37,6 +37,42 @@
tomee-embedded${tomee-embedded.version}
+
+ org.springframework
+ spring-context
+ ${springframework.version}
+
+
+
+ javax.ejb
+ javax.ejb-api
+ ${javax.ejb-api.version}
+ provided
+
+
+
+ org.springframework
+ spring-jms
+ ${springframework.version}
+
+
+ commons-logging
+ commons-logging
+
+
+
+
+
+ org.apache.activemq
+ activemq-broker
+ ${activemq.broker.version}
+
+
+ org.apache.activemq.tooling
+ activemq-junit
+ ${activemq.junit.version}
+ test
+ org.jboss.arquillian.junitarquillian-junit-container
@@ -81,6 +117,10 @@
1.7.53.1.21.0.0.CR4
+ 3.2
+ 5.2.3.RELEASE
+ 5.10.2
+ 5.13.1
diff --git a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/messagedriven/RecieverMDB.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/messagedriven/RecieverMDB.java
new file mode 100644
index 0000000000..f7f43244d5
--- /dev/null
+++ b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/messagedriven/RecieverMDB.java
@@ -0,0 +1,63 @@
+package com.baeldung.ejbspringcomparison.ejb.messagedriven;
+
+import javax.annotation.Resource;
+import javax.ejb.ActivationConfigProperty;
+import javax.ejb.MessageDriven;
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.DeliveryMode;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageListener;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+
+@MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = "destination", propertyValue = "myQueue"), @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") })
+public class RecieverMDB implements MessageListener {
+
+ @Resource
+ private ConnectionFactory connectionFactory;
+
+ @Resource(name = "ackQueue")
+ private Queue ackQueue;
+
+ public void onMessage(Message message) {
+ try {
+
+ TextMessage textMessage = (TextMessage) message;
+ String producerPing = textMessage.getText();
+
+ if (producerPing.equals("marco")) {
+ acknowledge("polo");
+ }
+ } catch (JMSException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ private void acknowledge(String text) throws JMSException {
+
+ Connection connection = null;
+ Session session = null;
+
+ try {
+ connection = connectionFactory.createConnection();
+ connection.start();
+
+ session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+ MessageProducer ackSender = session.createProducer(ackQueue);
+ ackSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
+
+ TextMessage message = session.createTextMessage(text);
+
+ ackSender.send(message);
+ } finally {
+ session.close();
+ connection.close();
+ }
+ }
+
+}
diff --git a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/singleton/CounterEJB.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/singleton/CounterEJB.java
new file mode 100644
index 0000000000..6873a717a9
--- /dev/null
+++ b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/singleton/CounterEJB.java
@@ -0,0 +1,23 @@
+package com.baeldung.ejbspringcomparison.ejb.singleton;
+
+import javax.ejb.Singleton;
+
+@Singleton
+public class CounterEJB implements CounterEJBRemote {
+
+ private int count = 1;
+ private String name;
+
+ public int count() {
+ return count++;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
\ No newline at end of file
diff --git a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/singleton/CounterEJBRemote.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/singleton/CounterEJBRemote.java
new file mode 100644
index 0000000000..ed02cfed4c
--- /dev/null
+++ b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/singleton/CounterEJBRemote.java
@@ -0,0 +1,10 @@
+package com.baeldung.ejbspringcomparison.ejb.singleton;
+
+import javax.ejb.Remote;
+
+@Remote
+public interface CounterEJBRemote {
+ int count();
+ String getName();
+ void setName(String name);
+}
diff --git a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/stateful/ShoppingCartEJB.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/stateful/ShoppingCartEJB.java
new file mode 100644
index 0000000000..e01e53add1
--- /dev/null
+++ b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/stateful/ShoppingCartEJB.java
@@ -0,0 +1,32 @@
+package com.baeldung.ejbspringcomparison.ejb.stateful;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.ejb.Stateful;
+
+@Stateful
+public class ShoppingCartEJB implements ShoppingCartEJBRemote {
+ private String name;
+ private List shoppingCart;
+
+ public ShoppingCartEJB() {
+ shoppingCart = new ArrayList();
+ }
+
+ public void addItem(String item) {
+ shoppingCart.add(item);
+ }
+
+ public List getItems() {
+ return shoppingCart;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+}
diff --git a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/stateful/ShoppingCartEJBRemote.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/stateful/ShoppingCartEJBRemote.java
new file mode 100644
index 0000000000..cea9cc3ad9
--- /dev/null
+++ b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/stateful/ShoppingCartEJBRemote.java
@@ -0,0 +1,17 @@
+package com.baeldung.ejbspringcomparison.ejb.stateful;
+
+import java.util.List;
+
+import javax.ejb.Remote;
+
+@Remote
+public interface ShoppingCartEJBRemote {
+
+ void addItem(String item);
+
+ List getItems();
+
+ void setName(String name);
+
+ String getName();
+}
diff --git a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/stateless/FinderEJB.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/stateless/FinderEJB.java
new file mode 100644
index 0000000000..7609b17675
--- /dev/null
+++ b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/stateless/FinderEJB.java
@@ -0,0 +1,25 @@
+package com.baeldung.ejbspringcomparison.ejb.stateless;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.ejb.Stateless;
+
+@Stateless
+public class FinderEJB implements FinderEJBRemote {
+
+ private Map alphabet;
+
+ public FinderEJB() {
+ alphabet = new HashMap();
+ alphabet.put("A", "Apple");
+ alphabet.put("B", "Ball");
+ alphabet.put("C", "Cat");
+ alphabet.put("D", "Dog");
+ }
+
+ public String search(String keyword) {
+ return alphabet.get(keyword);
+ }
+
+}
diff --git a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/stateless/FinderEJBRemote.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/stateless/FinderEJBRemote.java
new file mode 100644
index 0000000000..0354eff2b8
--- /dev/null
+++ b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/ejb/stateless/FinderEJBRemote.java
@@ -0,0 +1,9 @@
+package com.baeldung.ejbspringcomparison.ejb.stateless;
+
+import javax.ejb.Remote;
+
+@Remote
+public interface FinderEJBRemote {
+
+ String search(String keyword);
+}
diff --git a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/config/ApplicationConfig.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/config/ApplicationConfig.java
new file mode 100644
index 0000000000..8d6114d1c5
--- /dev/null
+++ b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/config/ApplicationConfig.java
@@ -0,0 +1,36 @@
+package com.baeldung.ejbspringcomparison.spring.config;
+
+import javax.jms.ConnectionFactory;
+
+import org.apache.activemq.ActiveMQConnectionFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.jms.annotation.EnableJms;
+import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
+import org.springframework.jms.core.JmsTemplate;
+
+@Configuration
+@ComponentScan(basePackages = "com.baeldung.ejbspringcomparison.spring")
+@EnableJms
+public class ApplicationConfig {
+
+ @Bean
+ public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
+ DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
+ factory.setConnectionFactory(connectionFactory());
+ return factory;
+ }
+
+ @Bean
+ public ConnectionFactory connectionFactory() {
+ return new ActiveMQConnectionFactory("tcp://localhost:61616");
+ }
+
+ @Bean
+ public JmsTemplate jmsTemplate() {
+ JmsTemplate template = new JmsTemplate(connectionFactory());
+ template.setConnectionFactory(connectionFactory());
+ return template;
+ }
+}
diff --git a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/messagedriven/Producer.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/messagedriven/Producer.java
new file mode 100644
index 0000000000..683ae7f51b
--- /dev/null
+++ b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/messagedriven/Producer.java
@@ -0,0 +1,19 @@
+package com.baeldung.ejbspringcomparison.spring.messagedriven;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jms.core.JmsTemplate;
+import org.springframework.stereotype.Component;
+
+@Component
+public class Producer {
+ @Autowired
+ private JmsTemplate jmsTemplate;
+
+ public void sendMessageToDefaultDestination(final String message) {
+ jmsTemplate.convertAndSend("myQueue", message);
+ }
+
+ public String receiveAck() {
+ return (String) jmsTemplate.receiveAndConvert("ackQueue");
+ }
+}
\ No newline at end of file
diff --git a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/messagedriven/Receiver.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/messagedriven/Receiver.java
new file mode 100644
index 0000000000..9a483e23c9
--- /dev/null
+++ b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/messagedriven/Receiver.java
@@ -0,0 +1,22 @@
+package com.baeldung.ejbspringcomparison.spring.messagedriven;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.jms.core.JmsTemplate;
+import org.springframework.stereotype.Component;
+
+@Component
+public class Receiver {
+ @Autowired
+ private JmsTemplate jmsTemplate;
+
+ @JmsListener(destination = "myQueue")
+ public void receiveMessage(String msg) {
+ sendAck();
+ }
+
+ private void sendAck() {
+ jmsTemplate.convertAndSend("ackQueue", "polo");
+ }
+
+}
\ No newline at end of file
diff --git a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/singleton/CounterBean.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/singleton/CounterBean.java
new file mode 100644
index 0000000000..6b2b57582d
--- /dev/null
+++ b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/singleton/CounterBean.java
@@ -0,0 +1,22 @@
+package com.baeldung.ejbspringcomparison.spring.singleton;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class CounterBean {
+ private int count = 1;
+ private String name;
+
+ public int count() {
+ return count++;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
diff --git a/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/stateful/ShoppingCartBean.java b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/stateful/ShoppingCartBean.java
new file mode 100644
index 0000000000..e6e026f52a
--- /dev/null
+++ b/spring-ejb/ejb-beans/src/main/java/com/baeldung/ejbspringcomparison/spring/stateful/ShoppingCartBean.java
@@ -0,0 +1,36 @@
+package com.baeldung.ejbspringcomparison.spring.stateful;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+@Component
+@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class ShoppingCartBean {
+
+ private String name;
+ private List shoppingCart;
+
+ public ShoppingCartBean() {
+ shoppingCart = new ArrayList();
+ }
+
+ public void addItem(String item) {
+ shoppingCart.add(item);
+ }
+
+ public List getItems() {
+ return shoppingCart;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+}
diff --git a/spring-ejb/ejb-beans/src/test/java/com/baeldung/ejbspringcomparison/ejb/EJBUnitTest.java b/spring-ejb/ejb-beans/src/test/java/com/baeldung/ejbspringcomparison/ejb/EJBUnitTest.java
new file mode 100644
index 0000000000..069028253e
--- /dev/null
+++ b/spring-ejb/ejb-beans/src/test/java/com/baeldung/ejbspringcomparison/ejb/EJBUnitTest.java
@@ -0,0 +1,140 @@
+package com.baeldung.ejbspringcomparison.ejb;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+import javax.annotation.Resource;
+import javax.ejb.EJB;
+import javax.ejb.embeddable.EJBContainer;
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.JMSException;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+import javax.naming.Context;
+import javax.naming.NamingException;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.baeldung.ejbspringcomparison.ejb.singleton.CounterEJBRemote;
+import com.baeldung.ejbspringcomparison.ejb.stateful.ShoppingCartEJBRemote;
+import com.baeldung.ejbspringcomparison.ejb.stateless.FinderEJBRemote;
+
+public class EJBUnitTest {
+
+ private static EJBContainer ejbContainer = null;
+
+ private static Context context = null;
+
+ @Resource
+ private ConnectionFactory connectionFactory;
+
+ @EJB
+ private FinderEJBRemote alphabetFinder;
+
+ @Resource(name = "myQueue")
+ private Queue myQueue;
+
+ @Resource(name = "ackQueue")
+ private Queue ackQueue;
+
+ @BeforeClass
+ public static void start() throws NamingException {
+ ejbContainer = EJBContainer.createEJBContainer();
+ }
+
+ @Before
+ public void initializeContext() throws NamingException {
+ context = ejbContainer.getContext();
+ context.bind("inject", this);
+ }
+
+ @Test
+ public void givenSingletonBean_whenCounterInvoked_thenCountIsIncremented() throws NamingException {
+
+ int count = 0;
+ CounterEJBRemote firstCounter = (CounterEJBRemote) context.lookup("java:global/ejb-beans/CounterEJB");
+ firstCounter.setName("first");
+
+ for (int i = 0; i < 10; i++) {
+ count = firstCounter.count();
+ }
+
+ assertEquals(10, count);
+ assertEquals("first", firstCounter.getName());
+
+ CounterEJBRemote secondCounter = (CounterEJBRemote) context.lookup("java:global/ejb-beans/CounterEJB");
+
+ int count2 = 0;
+ for (int i = 0; i < 10; i++) {
+ count2 = secondCounter.count();
+ }
+
+ assertEquals(20, count2);
+ assertEquals("first", secondCounter.getName());
+
+ }
+
+ @Test
+ public void givenStatefulBean_whenBathingCartWithThreeItemsAdded_thenItemsSizeIsThree() throws NamingException {
+ ShoppingCartEJBRemote bathingCart = (ShoppingCartEJBRemote) context.lookup("java:global/ejb-beans/ShoppingCartEJB");
+
+ bathingCart.setName("bathingCart");
+
+ bathingCart.addItem("soap");
+ bathingCart.addItem("shampoo");
+ bathingCart.addItem("oil");
+
+ assertEquals(3, bathingCart.getItems()
+ .size());
+ assertEquals("bathingCart", bathingCart.getName());
+
+ ShoppingCartEJBRemote fruitCart = (ShoppingCartEJBRemote) context.lookup("java:global/ejb-beans/ShoppingCartEJB");
+
+ fruitCart.addItem("apples");
+ fruitCart.addItem("oranges");
+
+ assertEquals(2, fruitCart.getItems()
+ .size());
+ assertNull(fruitCart.getName());
+ }
+
+ @Test
+ public void givenStatelessBean_whenSearchForA_thenApple() throws NamingException {
+
+ assertEquals("Apple", alphabetFinder.search("A"));
+ }
+
+ @Test
+ public void givenMDB_whenMessageSent_thenAcknowledgementReceived() throws InterruptedException, JMSException, NamingException {
+
+ Connection connection = connectionFactory.createConnection();
+ connection.start();
+ Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ MessageProducer producer = session.createProducer(myQueue);
+ producer.send(session.createTextMessage("marco"));
+ MessageConsumer response = session.createConsumer(ackQueue);
+
+ assertEquals("polo", ((TextMessage) response.receive(1000)).getText());
+
+ }
+
+ @After
+ public void reset() throws NamingException {
+ context.unbind("inject");
+ }
+
+ @AfterClass
+ public static void closeContext() throws NamingException {
+ context.close();
+ ejbContainer.close();
+ }
+
+}
diff --git a/spring-ejb/ejb-beans/src/test/java/com/baeldung/ejbspringcomparison/spring/SpringUnitTest.java b/spring-ejb/ejb-beans/src/test/java/com/baeldung/ejbspringcomparison/spring/SpringUnitTest.java
new file mode 100644
index 0000000000..e0b397befe
--- /dev/null
+++ b/spring-ejb/ejb-beans/src/test/java/com/baeldung/ejbspringcomparison/spring/SpringUnitTest.java
@@ -0,0 +1,108 @@
+package com.baeldung.ejbspringcomparison.spring;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+import javax.naming.NamingException;
+
+import org.apache.activemq.junit.EmbeddedActiveMQBroker;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+
+import com.baeldung.ejbspringcomparison.spring.config.ApplicationConfig;
+import com.baeldung.ejbspringcomparison.spring.messagedriven.Producer;
+import com.baeldung.ejbspringcomparison.spring.singleton.CounterBean;
+import com.baeldung.ejbspringcomparison.spring.stateful.ShoppingCartBean;
+
+public class SpringUnitTest {
+
+ private static AnnotationConfigApplicationContext context = null;
+
+ @ClassRule
+ public static EmbeddedActiveMQBroker broker = new EmbeddedActiveMQBroker() {
+ @Override
+ protected void configure() {
+ this.getBrokerService()
+ .setUseJmx(true);
+ try {
+ this.getBrokerService()
+ .addConnector("tcp://localhost:61616");
+ } catch (Exception e) {
+ Assert.fail(e.getMessage());
+ }
+ }
+ };
+
+ @BeforeClass
+ public static void init() {
+ context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
+ }
+
+ @Test
+ public void whenCounterInvoked_thenCountIsIncremented() throws NamingException {
+
+ CounterBean firstCounter = context.getBean(CounterBean.class);
+ firstCounter.setName("first");
+ int count = 0;
+ for (int i = 0; i < 10; i++) {
+ count = firstCounter.count();
+ }
+
+ assertEquals(10, count);
+ assertEquals("first", firstCounter.getName());
+
+ CounterBean secondCounter = context.getBean(CounterBean.class);
+
+ int count2 = 0;
+ for (int i = 0; i < 10; i++) {
+ count2 = secondCounter.count();
+ }
+
+ assertEquals(20, count2);
+ assertEquals("first", secondCounter.getName());
+
+ }
+
+ @Test
+ public void whenBathingCartWithThreeItemsAdded_thenItemsSizeIsThree() throws NamingException {
+ ShoppingCartBean bathingCart = context.getBean(ShoppingCartBean.class);
+
+ bathingCart.setName("bathingCart");
+
+ bathingCart.addItem("soap");
+ bathingCart.addItem("shampoo");
+ bathingCart.addItem("oil");
+
+ assertEquals(3, bathingCart.getItems()
+ .size());
+
+ assertEquals("bathingCart", bathingCart.getName());
+
+ ShoppingCartBean fruitCart = context.getBean(ShoppingCartBean.class);
+
+ fruitCart.addItem("apples");
+ fruitCart.addItem("oranges");
+
+ assertEquals(2, fruitCart.getItems()
+ .size());
+ assertNull(fruitCart.getName());
+ }
+
+ @Test
+ public void givenJMSBean_whenMessageSent_thenAcknowledgementReceived() throws NamingException {
+ Producer producer = context.getBean(Producer.class);
+ producer.sendMessageToDefaultDestination("marco");
+
+ assertEquals("polo", producer.receiveAck());
+ }
+
+ @AfterClass
+ public static void closeContext() throws NamingException {
+ context.close();
+ }
+
+}
diff --git a/spring-jooq/pom.xml b/spring-jooq/pom.xml
index f3b8cce8dc..63c6b5c8ee 100644
--- a/spring-jooq/pom.xml
+++ b/spring-jooq/pom.xml
@@ -36,6 +36,7 @@
com.h2databaseh2
+ ${h2.version}
@@ -194,7 +195,6 @@
1.51.0.0org.jooq.example.spring.Application
- 2.1.9.RELEASE
\ No newline at end of file
diff --git a/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaApplication.java b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaApplication.java
index b313eafdb9..fde56bebc0 100644
--- a/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaApplication.java
+++ b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaApplication.java
@@ -25,7 +25,7 @@ public class KafkaApplication {
public static void main(String[] args) throws Exception {
ConfigurableApplicationContext context = SpringApplication.run(KafkaApplication.class, args);
-
+
MessageProducer producer = context.getBean(MessageProducer.class);
MessageListener listener = context.getBean(MessageListener.class);
/*
@@ -101,15 +101,17 @@ public class KafkaApplication {
private String greetingTopicName;
public void sendMessage(String message) {
-
+
ListenableFuture> future = kafkaTemplate.send(topicName, message);
-
+
future.addCallback(new ListenableFutureCallback>() {
@Override
public void onSuccess(SendResult result) {
- System.out.println("Sent message=[" + message + "] with offset=[" + result.getRecordMetadata().offset() + "]");
+ System.out.println("Sent message=[" + message + "] with offset=[" + result.getRecordMetadata()
+ .offset() + "]");
}
+
@Override
public void onFailure(Throwable ex) {
System.out.println("Unable to send message=[" + message + "] due to : " + ex.getMessage());
@@ -158,7 +160,7 @@ public class KafkaApplication {
latch.countDown();
}
- @KafkaListener(topicPartitions = @TopicPartition(topic = "${partitioned.topic.name}", partitions = { "0", "3" }))
+ @KafkaListener(topicPartitions = @TopicPartition(topic = "${partitioned.topic.name}", partitions = { "0", "3" }), containerFactory = "partitionsKafkaListenerContainerFactory")
public void listenToParition(@Payload String message, @Header(KafkaHeaders.RECEIVED_PARTITION_ID) int partition) {
System.out.println("Received Message: " + message + " from partition: " + partition);
this.partitionLatch.countDown();
diff --git a/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java
index 933d2353aa..abaa431eec 100644
--- a/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java
+++ b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaConsumerConfig.java
@@ -29,7 +29,7 @@ public class KafkaConsumerConfig {
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
return new DefaultKafkaConsumerFactory<>(props);
}
-
+
public ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory(String groupId) {
ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory(groupId));
@@ -50,12 +50,12 @@ public class KafkaConsumerConfig {
public ConcurrentKafkaListenerContainerFactory headersKafkaListenerContainerFactory() {
return kafkaListenerContainerFactory("headers");
}
-
+
@Bean
public ConcurrentKafkaListenerContainerFactory partitionsKafkaListenerContainerFactory() {
return kafkaListenerContainerFactory("partitions");
}
-
+
@Bean
public ConcurrentKafkaListenerContainerFactory filterKafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory factory = kafkaListenerContainerFactory("filter");
diff --git a/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaProducerConfig.java b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaProducerConfig.java
index 7e2527b36e..0223bab0fe 100644
--- a/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaProducerConfig.java
+++ b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaProducerConfig.java
@@ -32,7 +32,7 @@ public class KafkaProducerConfig {
public KafkaTemplate kafkaTemplate() {
return new KafkaTemplate<>(producerFactory());
}
-
+
@Bean
public ProducerFactory greetingProducerFactory() {
Map configProps = new HashMap<>();
@@ -41,10 +41,10 @@ public class KafkaProducerConfig {
configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
return new DefaultKafkaProducerFactory<>(configProps);
}
-
+
@Bean
public KafkaTemplate greetingKafkaTemplate() {
return new KafkaTemplate<>(greetingProducerFactory());
}
-
+
}
diff --git a/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaTopicConfig.java b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaTopicConfig.java
index a3426e78a3..fb60fadde4 100644
--- a/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaTopicConfig.java
+++ b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaTopicConfig.java
@@ -12,10 +12,10 @@ import org.springframework.kafka.core.KafkaAdmin;
@Configuration
public class KafkaTopicConfig {
-
+
@Value(value = "${kafka.bootstrapAddress}")
private String bootstrapAddress;
-
+
@Value(value = "${message.topic.name}")
private String topicName;
@@ -27,31 +27,31 @@ public class KafkaTopicConfig {
@Value(value = "${greeting.topic.name}")
private String greetingTopicName;
-
+
@Bean
public KafkaAdmin kafkaAdmin() {
Map configs = new HashMap<>();
configs.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapAddress);
return new KafkaAdmin(configs);
}
-
+
@Bean
public NewTopic topic1() {
- return new NewTopic(topicName, 1, (short) 1);
+ return new NewTopic(topicName, 1, (short) 1);
}
-
+
@Bean
public NewTopic topic2() {
- return new NewTopic(partionedTopicName, 6, (short) 1);
+ return new NewTopic(partionedTopicName, 6, (short) 1);
}
-
+
@Bean
public NewTopic topic3() {
- return new NewTopic(filteredTopicName, 1, (short) 1);
+ return new NewTopic(filteredTopicName, 1, (short) 1);
}
-
+
@Bean
public NewTopic topic4() {
- return new NewTopic(greetingTopicName, 1, (short) 1);
+ return new NewTopic(greetingTopicName, 1, (short) 1);
}
}
diff --git a/spring-mvc-basics-3/pom.xml b/spring-mvc-basics-3/pom.xml
index 48b1e51dd3..1dea8f9e93 100644
--- a/spring-mvc-basics-3/pom.xml
+++ b/spring-mvc-basics-3/pom.xml
@@ -138,7 +138,7 @@
- org.baeldung.boot.Application
+ com.baeldung.boot.Application3.1.13.3.7-12.2
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/Application.java b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/Application.java
index c1b6558b26..cb0d0c1532 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/Application.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/Application.java
@@ -1,4 +1,4 @@
-package org.baeldung.boot;
+package com.baeldung.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/config/WebConfig.java b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/config/WebConfig.java
index 6373553837..44a5e823f7 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/config/WebConfig.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/config/WebConfig.java
@@ -1,12 +1,12 @@
-package org.baeldung.boot.config;
+package com.baeldung.boot.config;
import java.util.List;
-import org.baeldung.boot.converter.GenericBigDecimalConverter;
-import org.baeldung.boot.converter.StringToAbstractEntityConverterFactory;
-import org.baeldung.boot.converter.StringToEmployeeConverter;
-import org.baeldung.boot.converter.StringToEnumConverter;
-import org.baeldung.boot.web.resolver.HeaderVersionArgumentResolver;
+import com.baeldung.boot.converter.GenericBigDecimalConverter;
+import com.baeldung.boot.converter.StringToAbstractEntityConverterFactory;
+import com.baeldung.boot.converter.StringToEmployeeConverter;
+import com.baeldung.boot.converter.StringToEnumConverter;
+import com.baeldung.boot.web.resolver.HeaderVersionArgumentResolver;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/controller/GenericEntityController.java b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/controller/GenericEntityController.java
index 17457f4c20..39fd5af318 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/controller/GenericEntityController.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/controller/GenericEntityController.java
@@ -1,8 +1,8 @@
-package org.baeldung.boot.controller;
+package com.baeldung.boot.controller;
-import org.baeldung.boot.domain.GenericEntity;
-import org.baeldung.boot.domain.Modes;
-import org.baeldung.boot.web.resolver.Version;
+import com.baeldung.boot.domain.GenericEntity;
+import com.baeldung.boot.domain.Modes;
+import com.baeldung.boot.web.resolver.Version;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/GenericBigDecimalConverter.java b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/GenericBigDecimalConverter.java
index f756a25f67..0040327e00 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/GenericBigDecimalConverter.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/GenericBigDecimalConverter.java
@@ -1,4 +1,4 @@
-package org.baeldung.boot.converter;
+package com.baeldung.boot.converter;
import com.google.common.collect.ImmutableSet;
import org.springframework.core.convert.TypeDescriptor;
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/StringToAbstractEntityConverterFactory.java b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/StringToAbstractEntityConverterFactory.java
index 9e7fd8f858..bfeb03f748 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/StringToAbstractEntityConverterFactory.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/StringToAbstractEntityConverterFactory.java
@@ -1,8 +1,8 @@
-package org.baeldung.boot.converter;
+package com.baeldung.boot.converter;
-import org.baeldung.boot.domain.AbstractEntity;
-import org.baeldung.boot.domain.Bar;
-import org.baeldung.boot.domain.Foo;
+import com.baeldung.boot.domain.AbstractEntity;
+import com.baeldung.boot.domain.Bar;
+import com.baeldung.boot.domain.Foo;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory;
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/StringToEmployeeConverter.java b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/StringToEmployeeConverter.java
index e00d0ad312..678ae49195 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/StringToEmployeeConverter.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/StringToEmployeeConverter.java
@@ -1,6 +1,6 @@
-package org.baeldung.boot.converter;
+package com.baeldung.boot.converter;
-import org.baeldung.boot.domain.Employee;
+import com.baeldung.boot.domain.Employee;
import org.springframework.core.convert.converter.Converter;
public class StringToEmployeeConverter implements Converter {
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/StringToEnumConverter.java b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/StringToEnumConverter.java
index 498b44abec..320c26cba0 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/StringToEnumConverter.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/StringToEnumConverter.java
@@ -1,6 +1,6 @@
-package org.baeldung.boot.converter;
+package com.baeldung.boot.converter;
-import org.baeldung.boot.domain.Modes;
+import com.baeldung.boot.domain.Modes;
import org.springframework.core.convert.converter.Converter;
public class StringToEnumConverter implements Converter {
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/StringToLocalDateTimeConverter.java b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/StringToLocalDateTimeConverter.java
index 8a08b438f2..8d9b85f57a 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/StringToLocalDateTimeConverter.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/StringToLocalDateTimeConverter.java
@@ -1,4 +1,4 @@
-package org.baeldung.boot.converter;
+package com.baeldung.boot.converter;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/controller/AbstractEntityController.java b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/controller/AbstractEntityController.java
index d3c012ba31..ac5bebcdeb 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/controller/AbstractEntityController.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/controller/AbstractEntityController.java
@@ -1,8 +1,8 @@
-package org.baeldung.boot.converter.controller;
+package com.baeldung.boot.converter.controller;
-import org.baeldung.boot.domain.Bar;
-import org.baeldung.boot.domain.Foo;
-import org.baeldung.boot.domain.Modes;
+import com.baeldung.boot.domain.Bar;
+import com.baeldung.boot.domain.Foo;
+import com.baeldung.boot.domain.Modes;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/controller/StringToEmployeeConverterController.java b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/controller/StringToEmployeeConverterController.java
index 762d237156..ed118f9cdb 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/controller/StringToEmployeeConverterController.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/converter/controller/StringToEmployeeConverterController.java
@@ -1,6 +1,6 @@
-package org.baeldung.boot.converter.controller;
+package com.baeldung.boot.converter.controller;
-import org.baeldung.boot.domain.Employee;
+import com.baeldung.boot.domain.Employee;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/domain/AbstractEntity.java b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/domain/AbstractEntity.java
index 30e0d1e5fe..08953928cb 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/domain/AbstractEntity.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/domain/AbstractEntity.java
@@ -1,4 +1,4 @@
-package org.baeldung.boot.domain;
+package com.baeldung.boot.domain;
public abstract class AbstractEntity {
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/domain/Bar.java b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/domain/Bar.java
index 724f5e4bca..063ed3db63 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/domain/Bar.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/domain/Bar.java
@@ -1,4 +1,4 @@
-package org.baeldung.boot.domain;
+package com.baeldung.boot.domain;
public class Bar extends AbstractEntity {
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/domain/Employee.java b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/domain/Employee.java
index 8242e53200..a96fc5d051 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/domain/Employee.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/domain/Employee.java
@@ -1,4 +1,4 @@
-package org.baeldung.boot.domain;
+package com.baeldung.boot.domain;
import javax.persistence.Entity;
import javax.persistence.Id;
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/domain/Foo.java b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/domain/Foo.java
index a2ff354e59..c6637f6162 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/domain/Foo.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/domain/Foo.java
@@ -1,4 +1,4 @@
-package org.baeldung.boot.domain;
+package com.baeldung.boot.domain;
import static org.apache.commons.lang3.RandomStringUtils.randomAlphanumeric;
public class Foo extends AbstractEntity {
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/domain/GenericEntity.java b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/domain/GenericEntity.java
index f1c936e432..a2a676200a 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/domain/GenericEntity.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/domain/GenericEntity.java
@@ -1,4 +1,4 @@
-package org.baeldung.boot.domain;
+package com.baeldung.boot.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/domain/Modes.java b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/domain/Modes.java
index dcba064e8c..7717294996 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/domain/Modes.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/domain/Modes.java
@@ -1,4 +1,4 @@
-package org.baeldung.boot.domain;
+package com.baeldung.boot.domain;
public enum Modes {
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/repository/GenericEntityRepository.java b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/repository/GenericEntityRepository.java
index d897e17afe..5abe7ea6b1 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/repository/GenericEntityRepository.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/repository/GenericEntityRepository.java
@@ -1,6 +1,6 @@
-package org.baeldung.boot.repository;
+package com.baeldung.boot.repository;
-import org.baeldung.boot.domain.GenericEntity;
+import com.baeldung.boot.domain.GenericEntity;
import org.springframework.data.jpa.repository.JpaRepository;
public interface GenericEntityRepository extends JpaRepository {
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/web/resolver/HeaderVersionArgumentResolver.java b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/web/resolver/HeaderVersionArgumentResolver.java
index b3a0dba7e8..de10fa5098 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/web/resolver/HeaderVersionArgumentResolver.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/web/resolver/HeaderVersionArgumentResolver.java
@@ -1,4 +1,4 @@
-package org.baeldung.boot.web.resolver;
+package com.baeldung.boot.web.resolver;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/web/resolver/Version.java b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/web/resolver/Version.java
index f69d40510e..84dabe2b47 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/boot/web/resolver/Version.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/boot/web/resolver/Version.java
@@ -1,4 +1,4 @@
-package org.baeldung.boot.web.resolver;
+package com.baeldung.boot.web.resolver;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/CachedBodyHttpServletRequest.java b/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/CachedBodyHttpServletRequest.java
index b6d4905653..89acbe79a4 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/CachedBodyHttpServletRequest.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/CachedBodyHttpServletRequest.java
@@ -1,4 +1,4 @@
-package org.baeldung.cachedrequest;
+package com.baeldung.cachedrequest;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/CachedBodyServletInputStream.java b/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/CachedBodyServletInputStream.java
index a18de30788..4d44b23ee9 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/CachedBodyServletInputStream.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/CachedBodyServletInputStream.java
@@ -1,4 +1,4 @@
-package org.baeldung.cachedrequest;
+package com.baeldung.cachedrequest;
import java.io.ByteArrayInputStream;
import java.io.IOException;
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/ContentCachingFilter.java b/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/ContentCachingFilter.java
index e3f3b7a060..ba3901077b 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/ContentCachingFilter.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/ContentCachingFilter.java
@@ -1,4 +1,4 @@
-package org.baeldung.cachedrequest;
+package com.baeldung.cachedrequest;
import java.io.IOException;
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/HttpRequestDemoConfig.java b/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/HttpRequestDemoConfig.java
index 9194bcf27c..9516ff861e 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/HttpRequestDemoConfig.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/HttpRequestDemoConfig.java
@@ -1,4 +1,4 @@
-package org.baeldung.cachedrequest;
+package com.baeldung.cachedrequest;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@@ -6,12 +6,12 @@ import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* To initialize the WebApplication, Please see
- * {@link org.baeldung.spring.config.MainWebAppInitializer}
+ * {@link com.baeldung.spring.config.MainWebAppInitializer}
*/
@EnableWebMvc
@Configuration
-@ComponentScan(basePackages = "org.baeldung.cachedrequest")
+@ComponentScan(basePackages = "com.baeldung.cachedrequest")
public class HttpRequestDemoConfig implements WebMvcConfigurer {
}
\ No newline at end of file
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/Person.java b/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/Person.java
index 594b6f2360..d7ac4c66a3 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/Person.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/Person.java
@@ -1,4 +1,4 @@
-package org.baeldung.cachedrequest;
+package com.baeldung.cachedrequest;
public class Person {
private String firstName;
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/PersonController.java b/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/PersonController.java
index 6f241b3fb3..3c505f4754 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/PersonController.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/PersonController.java
@@ -1,4 +1,4 @@
-package org.baeldung.cachedrequest;
+package com.baeldung.cachedrequest;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
diff --git a/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/PrintRequestContentFilter.java b/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/PrintRequestContentFilter.java
index 55455f590f..9c4c589a5d 100644
--- a/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/PrintRequestContentFilter.java
+++ b/spring-mvc-basics-3/src/main/java/com/baeldung/cachedrequest/PrintRequestContentFilter.java
@@ -1,4 +1,4 @@
-package org.baeldung.cachedrequest;
+package com.baeldung.cachedrequest;
import java.io.IOException;
diff --git a/spring-mvc-basics-3/src/test/java/com/baeldung/SpringBootApplicationIntegrationTest.java b/spring-mvc-basics-3/src/test/java/com/baeldung/SpringBootApplicationIntegrationTest.java
index bccca58aea..d2b4c1aff9 100644
--- a/spring-mvc-basics-3/src/test/java/com/baeldung/SpringBootApplicationIntegrationTest.java
+++ b/spring-mvc-basics-3/src/test/java/com/baeldung/SpringBootApplicationIntegrationTest.java
@@ -1,7 +1,7 @@
package com.baeldung;
-import org.baeldung.boot.Application;
-import org.baeldung.boot.domain.Modes;
+import com.baeldung.boot.Application;
+import com.baeldung.boot.domain.Modes;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-mvc-basics-3/src/test/java/com/baeldung/SpringBootJPAIntegrationTest.java b/spring-mvc-basics-3/src/test/java/com/baeldung/SpringBootJPAIntegrationTest.java
index c283529435..6ebc34973e 100644
--- a/spring-mvc-basics-3/src/test/java/com/baeldung/SpringBootJPAIntegrationTest.java
+++ b/spring-mvc-basics-3/src/test/java/com/baeldung/SpringBootJPAIntegrationTest.java
@@ -1,8 +1,8 @@
package com.baeldung;
-import org.baeldung.boot.Application;
-import org.baeldung.boot.domain.GenericEntity;
-import org.baeldung.boot.repository.GenericEntityRepository;
+import com.baeldung.boot.Application;
+import com.baeldung.boot.domain.GenericEntity;
+import com.baeldung.boot.repository.GenericEntityRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/spring-mvc-basics-3/src/test/java/com/baeldung/SpringBootMailIntegrationTest.java b/spring-mvc-basics-3/src/test/java/com/baeldung/SpringBootMailIntegrationTest.java
index 1a2a4e22d9..1349e7e9e0 100644
--- a/spring-mvc-basics-3/src/test/java/com/baeldung/SpringBootMailIntegrationTest.java
+++ b/spring-mvc-basics-3/src/test/java/com/baeldung/SpringBootMailIntegrationTest.java
@@ -1,6 +1,6 @@
package com.baeldung;
-import org.baeldung.boot.Application;
+import com.baeldung.boot.Application;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
diff --git a/spring-mvc-basics-3/src/test/java/com/baeldung/cachedrequest/CachedBodyHttpServletRequestUnitTest.java b/spring-mvc-basics-3/src/test/java/com/baeldung/cachedrequest/CachedBodyHttpServletRequestUnitTest.java
index 1fe9dd4c82..1ff0093b4b 100644
--- a/spring-mvc-basics-3/src/test/java/com/baeldung/cachedrequest/CachedBodyHttpServletRequestUnitTest.java
+++ b/spring-mvc-basics-3/src/test/java/com/baeldung/cachedrequest/CachedBodyHttpServletRequestUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.cachedrequest;
+package com.baeldung.cachedrequest;
import java.io.BufferedReader;
import java.io.IOException;
diff --git a/spring-mvc-basics-3/src/test/java/com/baeldung/cachedrequest/CachedBodyServletInputStreamUnitTest.java b/spring-mvc-basics-3/src/test/java/com/baeldung/cachedrequest/CachedBodyServletInputStreamUnitTest.java
index d7000d91ee..af025f632e 100644
--- a/spring-mvc-basics-3/src/test/java/com/baeldung/cachedrequest/CachedBodyServletInputStreamUnitTest.java
+++ b/spring-mvc-basics-3/src/test/java/com/baeldung/cachedrequest/CachedBodyServletInputStreamUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.cachedrequest;
+package com.baeldung.cachedrequest;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
diff --git a/spring-mvc-basics-3/src/test/java/com/baeldung/cachedrequest/ContentCachingFilterUnitTest.java b/spring-mvc-basics-3/src/test/java/com/baeldung/cachedrequest/ContentCachingFilterUnitTest.java
index 057f1ac627..ec0f8948c2 100644
--- a/spring-mvc-basics-3/src/test/java/com/baeldung/cachedrequest/ContentCachingFilterUnitTest.java
+++ b/spring-mvc-basics-3/src/test/java/com/baeldung/cachedrequest/ContentCachingFilterUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.cachedrequest;
+package com.baeldung.cachedrequest;
import java.io.IOException;
diff --git a/spring-mvc-basics-3/src/test/java/com/baeldung/cachedrequest/PersonControllerIntegrationTest.java b/spring-mvc-basics-3/src/test/java/com/baeldung/cachedrequest/PersonControllerIntegrationTest.java
index 046a310cc0..9212ceb886 100644
--- a/spring-mvc-basics-3/src/test/java/com/baeldung/cachedrequest/PersonControllerIntegrationTest.java
+++ b/spring-mvc-basics-3/src/test/java/com/baeldung/cachedrequest/PersonControllerIntegrationTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.cachedrequest;
+package com.baeldung.cachedrequest;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Before;
diff --git a/spring-mvc-basics-3/src/test/java/com/baeldung/cachedrequest/PrintRequestContentFilterUnitTest.java b/spring-mvc-basics-3/src/test/java/com/baeldung/cachedrequest/PrintRequestContentFilterUnitTest.java
index ca2d5c600b..3d2acabe6b 100644
--- a/spring-mvc-basics-3/src/test/java/com/baeldung/cachedrequest/PrintRequestContentFilterUnitTest.java
+++ b/spring-mvc-basics-3/src/test/java/com/baeldung/cachedrequest/PrintRequestContentFilterUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.cachedrequest;
+package com.baeldung.cachedrequest;
import java.io.IOException;
diff --git a/spring-mvc-basics-4/src/main/java/com/baeldung/controller/config/StudentControllerConfig.java b/spring-mvc-basics-4/src/main/java/com/baeldung/controller/config/StudentControllerConfig.java
index 218418ecc8..b84094132d 100644
--- a/spring-mvc-basics-4/src/main/java/com/baeldung/controller/config/StudentControllerConfig.java
+++ b/spring-mvc-basics-4/src/main/java/com/baeldung/controller/config/StudentControllerConfig.java
@@ -1,4 +1,4 @@
-package org.baeldung.controller.config;
+package com.baeldung.controller.config;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
diff --git a/spring-mvc-basics-4/src/main/java/com/baeldung/controller/config/WebConfig.java b/spring-mvc-basics-4/src/main/java/com/baeldung/controller/config/WebConfig.java
index 018c530f18..6e79ac0aad 100644
--- a/spring-mvc-basics-4/src/main/java/com/baeldung/controller/config/WebConfig.java
+++ b/spring-mvc-basics-4/src/main/java/com/baeldung/controller/config/WebConfig.java
@@ -1,4 +1,4 @@
-package org.baeldung.controller.config;
+package com.baeldung.controller.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
@@ -11,7 +11,7 @@ import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@EnableWebMvc
-@ComponentScan(basePackages = { "org.baeldung.controller.controller", "com.baeldung.controller", "org.baeldung.controller.config" })
+@ComponentScan(basePackages = { "com.baeldung.controller.controller", "com.baeldung.controller", "com.baeldung.controller.config" })
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
diff --git a/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/PassParametersController.java b/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/PassParametersController.java
index c282ae6a62..d8330333cb 100644
--- a/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/PassParametersController.java
+++ b/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/PassParametersController.java
@@ -1,4 +1,4 @@
-package org.baeldung.controller.controller;
+package com.baeldung.controller.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
diff --git a/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/RestAnnotatedController.java b/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/RestAnnotatedController.java
index 48981fd012..f41d45caff 100644
--- a/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/RestAnnotatedController.java
+++ b/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/RestAnnotatedController.java
@@ -1,6 +1,6 @@
-package org.baeldung.controller.controller;
+package com.baeldung.controller.controller;
-import org.baeldung.controller.student.Student;
+import com.baeldung.controller.student.Student;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
diff --git a/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/RestController.java b/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/RestController.java
index 4e5d1d9e17..a529faeed3 100644
--- a/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/RestController.java
+++ b/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/RestController.java
@@ -1,6 +1,6 @@
-package org.baeldung.controller.controller;
+package com.baeldung.controller.controller;
-import org.baeldung.controller.student.Student;
+import com.baeldung.controller.student.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
diff --git a/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/TestController.java b/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/TestController.java
index 12ae4e0ab1..cf275ffc0f 100644
--- a/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/TestController.java
+++ b/spring-mvc-basics-4/src/main/java/com/baeldung/controller/controller/TestController.java
@@ -2,7 +2,7 @@
/**
* @author Prashant Dutta
*/
-package org.baeldung.controller.controller;
+package com.baeldung.controller.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
diff --git a/spring-mvc-basics-4/src/main/java/com/baeldung/controller/student/Student.java b/spring-mvc-basics-4/src/main/java/com/baeldung/controller/student/Student.java
index 5f49e5ceb9..8a82dd5553 100644
--- a/spring-mvc-basics-4/src/main/java/com/baeldung/controller/student/Student.java
+++ b/spring-mvc-basics-4/src/main/java/com/baeldung/controller/student/Student.java
@@ -1,4 +1,4 @@
-package org.baeldung.controller.student;
+package com.baeldung.controller.student;
public class Student {
private String name;
diff --git a/spring-mvc-basics-4/src/main/resources/test-mvc.xml b/spring-mvc-basics-4/src/main/resources/test-mvc.xml
index 8013170379..44c300dfc6 100644
--- a/spring-mvc-basics-4/src/main/resources/test-mvc.xml
+++ b/spring-mvc-basics-4/src/main/resources/test-mvc.xml
@@ -10,7 +10,7 @@
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
-
+
diff --git a/spring-mvc-basics-4/src/main/webapp/WEB-INF/web-old.xml b/spring-mvc-basics-4/src/main/webapp/WEB-INF/web-old.xml
index 03322279e2..1344362d19 100644
--- a/spring-mvc-basics-4/src/main/webapp/WEB-INF/web-old.xml
+++ b/spring-mvc-basics-4/src/main/webapp/WEB-INF/web-old.xml
@@ -29,7 +29,7 @@
-->
diff --git a/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerAnnotationIntegrationTest.java b/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerAnnotationIntegrationTest.java
index e32d9f7aca..f378357548 100644
--- a/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerAnnotationIntegrationTest.java
+++ b/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerAnnotationIntegrationTest.java
@@ -1,8 +1,8 @@
-package org.baeldung.controller;
+package com.baeldung.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
-import org.baeldung.controller.config.WebConfig;
-import org.baeldung.controller.student.Student;
+import com.baeldung.controller.config.WebConfig;
+import com.baeldung.controller.student.Student;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
diff --git a/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerIntegrationTest.java b/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerIntegrationTest.java
index 8e8a021530..7e5cf1532e 100644
--- a/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerIntegrationTest.java
+++ b/spring-mvc-basics-4/src/test/java/com/baeldung/controller/ControllerIntegrationTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.controller;
+package com.baeldung.controller;
import org.junit.Assert;
import org.junit.Before;
@@ -14,7 +14,7 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.ModelAndView;
-import org.baeldung.controller.student.Student;
+import com.baeldung.controller.student.Student;
import com.fasterxml.jackson.databind.ObjectMapper;
@RunWith(SpringJUnit4ClassRunner.class)
diff --git a/spring-mvc-basics-4/src/test/java/com/baeldung/controller/PassParametersControllerIntegrationTest.java b/spring-mvc-basics-4/src/test/java/com/baeldung/controller/PassParametersControllerIntegrationTest.java
index 21084f44ce..aa8148c1ef 100644
--- a/spring-mvc-basics-4/src/test/java/com/baeldung/controller/PassParametersControllerIntegrationTest.java
+++ b/spring-mvc-basics-4/src/test/java/com/baeldung/controller/PassParametersControllerIntegrationTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.controller;
+package com.baeldung.controller;
import org.junit.Assert;
import org.junit.Before;
@@ -15,7 +15,7 @@ import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.ModelAndView;
/**
- * This is the test class for {@link org.baeldung.controller.controller.PassParametersController} class.
+ * This is the test class for {@link com.baeldung.controller.controller.PassParametersController} class.
* 09/09/2017
*
* @author Ahmet Cetin
diff --git a/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerIntegrationTest.java b/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerIntegrationTest.java
index 2fb3569fc1..173ac165c3 100644
--- a/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerIntegrationTest.java
+++ b/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerIntegrationTest.java
@@ -12,7 +12,7 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
-import org.baeldung.controller.config.WebConfig;
+import com.baeldung.controller.config.WebConfig;
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
diff --git a/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerWithOptionalParamIntegrationTest.java b/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerWithOptionalParamIntegrationTest.java
index c7b568b68e..1fadfb7038 100644
--- a/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerWithOptionalParamIntegrationTest.java
+++ b/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerWithOptionalParamIntegrationTest.java
@@ -12,7 +12,7 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
-import org.baeldung.controller.config.WebConfig;
+import com.baeldung.controller.config.WebConfig;
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
diff --git a/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerWithRequiredAttributeIntegrationTest.java b/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerWithRequiredAttributeIntegrationTest.java
index 760d94af17..00d620ef9a 100644
--- a/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerWithRequiredAttributeIntegrationTest.java
+++ b/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerControllerWithRequiredAttributeIntegrationTest.java
@@ -12,7 +12,7 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
-import org.baeldung.controller.config.WebConfig;
+import com.baeldung.controller.config.WebConfig;
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
diff --git a/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerWithMapParamIntegrationTest.java b/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerWithMapParamIntegrationTest.java
index fca6bba5fd..f7fff714a9 100644
--- a/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerWithMapParamIntegrationTest.java
+++ b/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerWithMapParamIntegrationTest.java
@@ -12,7 +12,7 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
-import org.baeldung.controller.config.WebConfig;
+import com.baeldung.controller.config.WebConfig;
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
diff --git a/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerWithTwoSeparateMethodsIntegrationTest.java b/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerWithTwoSeparateMethodsIntegrationTest.java
index 5d2733ec92..b4e4c9ade5 100644
--- a/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerWithTwoSeparateMethodsIntegrationTest.java
+++ b/spring-mvc-basics-4/src/test/java/com/baeldung/optionalpathvars/ArticleViewerWithTwoSeparateMethodsIntegrationTest.java
@@ -12,7 +12,7 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
-import org.baeldung.controller.config.WebConfig;
+import com.baeldung.controller.config.WebConfig;
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
diff --git a/spring-mvc-basics-4/src/test/resources/test-mvc.xml b/spring-mvc-basics-4/src/test/resources/test-mvc.xml
index 15f950ed4f..f1aa8e9504 100644
--- a/spring-mvc-basics-4/src/test/resources/test-mvc.xml
+++ b/spring-mvc-basics-4/src/test/resources/test-mvc.xml
@@ -10,7 +10,7 @@
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
-
+
diff --git a/spring-mvc-forms-jsp/src/test/java/org/baeldung/SpringContextTest.java b/spring-mvc-forms-jsp/src/test/java/org/baeldung/SpringContextTest.java
index e35fc8c86c..b7e09685b9 100644
--- a/spring-mvc-forms-jsp/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-mvc-forms-jsp/src/test/java/org/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import com.baeldung.springmvcforms.configuration.ApplicationConfiguration;
diff --git a/spring-mvc-forms-thymeleaf/src/test/java/org/baeldung/listbindingexample/SpringContextTest.java b/spring-mvc-forms-thymeleaf/src/test/java/org/baeldung/listbindingexample/SpringContextTest.java
index 751df882f9..12bb470f1b 100644
--- a/spring-mvc-forms-thymeleaf/src/test/java/org/baeldung/listbindingexample/SpringContextTest.java
+++ b/spring-mvc-forms-thymeleaf/src/test/java/org/baeldung/listbindingexample/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.listbindingexample;
+package com.baeldung.listbindingexample;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-mvc-forms-thymeleaf/src/test/java/org/baeldung/sessionattrs/SpringContextTest.java b/spring-mvc-forms-thymeleaf/src/test/java/org/baeldung/sessionattrs/SpringContextTest.java
index 0b308319b1..a00c44206a 100644
--- a/spring-mvc-forms-thymeleaf/src/test/java/org/baeldung/sessionattrs/SpringContextTest.java
+++ b/spring-mvc-forms-thymeleaf/src/test/java/org/baeldung/sessionattrs/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.sessionattrs;
+package com.baeldung.sessionattrs;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-mvc-java/README.md b/spring-mvc-java/README.md
index ff1f7830b6..f1263860f9 100644
--- a/spring-mvc-java/README.md
+++ b/spring-mvc-java/README.md
@@ -16,3 +16,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Spring MVC @PathVariable with a dot (.) gets truncated](https://www.baeldung.com/spring-mvc-pathvariable-dot)
- [Working with Date Parameters in Spring](https://www.baeldung.com/spring-date-parameters)
- [A Java Web Application Without a web.xml](https://www.baeldung.com/java-web-app-without-web-xml)
+- [Accessing Spring MVC Model Objects in JavaScript](https://www.baeldung.com/spring-mvc-model-objects-js)
diff --git a/spring-mvc-java/pom.xml b/spring-mvc-java/pom.xml
index 0f3a1d65b9..079a664a5d 100644
--- a/spring-mvc-java/pom.xml
+++ b/spring-mvc-java/pom.xml
@@ -223,8 +223,6 @@
- 2.1.9.RELEASE
-
3.0.9.RELEASE
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/accessparamsjs/App.java b/spring-mvc-java/src/main/java/com/baeldung/accessparamsjs/App.java
similarity index 100%
rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/accessparamsjs/App.java
rename to spring-mvc-java/src/main/java/com/baeldung/accessparamsjs/App.java
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/accessparamsjs/Controller.java b/spring-mvc-java/src/main/java/com/baeldung/accessparamsjs/Controller.java
similarity index 100%
rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/accessparamsjs/Controller.java
rename to spring-mvc-java/src/main/java/com/baeldung/accessparamsjs/Controller.java
index 8759f1bcd6..157dcf54da 100644
--- a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/accessparamsjs/Controller.java
+++ b/spring-mvc-java/src/main/java/com/baeldung/accessparamsjs/Controller.java
@@ -1,11 +1,11 @@
package com.baeldung.accessparamsjs;
-import java.util.Map;
-
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
+import java.util.Map;
+
/**
* Sample rest controller for the tutorial article
* "Access Spring MVC Model object in JavaScript".
diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/CustomWebMvcConfigurationSupport.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/CustomWebMvcConfigurationSupport.java
index 4a9f6a3431..a0dd7358d0 100644
--- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/CustomWebMvcConfigurationSupport.java
+++ b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/CustomWebMvcConfigurationSupport.java
@@ -1,17 +1,17 @@
package com.baeldung.spring.web.config;
-import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
-import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
@Configuration
public class CustomWebMvcConfigurationSupport extends WebMvcConfigurationSupport {
- @Bean
- public RequestMappingHandlerMapping requestMappingHandlerMapping() {
- RequestMappingHandlerMapping handlerMapping = super.requestMappingHandlerMapping();
- handlerMapping.setUseSuffixPatternMatch(false);
- return handlerMapping;
+ @Override
+ protected PathMatchConfigurer getPathMatchConfigurer() {
+ PathMatchConfigurer pathMatchConfigurer = super.getPathMatchConfigurer();
+ pathMatchConfigurer.setUseSuffixPatternMatch(false);
+
+ return pathMatchConfigurer;
}
}
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/resources/templates/thymeleaf/index.html b/spring-mvc-java/src/main/resources/templates/thymeleaf/index.html
similarity index 100%
rename from spring-boot-modules/spring-boot-mvc/src/main/resources/templates/thymeleaf/index.html
rename to spring-mvc-java/src/main/resources/templates/thymeleaf/index.html
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/webapp/js/jquery.js b/spring-mvc-java/src/main/webapp/js/jquery.js
similarity index 100%
rename from spring-boot-modules/spring-boot-mvc/src/main/webapp/js/jquery.js
rename to spring-mvc-java/src/main/webapp/js/jquery.js
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/webapp/js/script-async-jquery.js b/spring-mvc-java/src/main/webapp/js/script-async-jquery.js
similarity index 100%
rename from spring-boot-modules/spring-boot-mvc/src/main/webapp/js/script-async-jquery.js
rename to spring-mvc-java/src/main/webapp/js/script-async-jquery.js
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/webapp/js/script-async.js b/spring-mvc-java/src/main/webapp/js/script-async.js
similarity index 100%
rename from spring-boot-modules/spring-boot-mvc/src/main/webapp/js/script-async.js
rename to spring-mvc-java/src/main/webapp/js/script-async.js
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/webapp/js/script.js b/spring-mvc-java/src/main/webapp/js/script.js
similarity index 100%
rename from spring-boot-modules/spring-boot-mvc/src/main/webapp/js/script.js
rename to spring-mvc-java/src/main/webapp/js/script.js
diff --git a/spring-boot-modules/spring-boot-mvc/src/test/java/com/baeldung/accessparamsjs/ControllerUnitTest.java b/spring-mvc-java/src/test/java/com/baeldung/accessparamsjs/ControllerUnitTest.java
similarity index 100%
rename from spring-boot-modules/spring-boot-mvc/src/test/java/com/baeldung/accessparamsjs/ControllerUnitTest.java
rename to spring-mvc-java/src/test/java/com/baeldung/accessparamsjs/ControllerUnitTest.java
index 2dc62a20f6..f05d34b654 100644
--- a/spring-boot-modules/spring-boot-mvc/src/test/java/com/baeldung/accessparamsjs/ControllerUnitTest.java
+++ b/spring-mvc-java/src/test/java/com/baeldung/accessparamsjs/ControllerUnitTest.java
@@ -1,7 +1,5 @@
package com.baeldung.accessparamsjs;
-import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
-
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
@@ -12,6 +10,8 @@ import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
diff --git a/spring-mvc-java/src/test/java/com/baeldung/web/controller/GreetControllerIntegrationTest.java b/spring-mvc-java/src/test/java/com/baeldung/web/controller/GreetControllerIntegrationTest.java
index 079ea3e5cd..3d34a46791 100644
--- a/spring-mvc-java/src/test/java/com/baeldung/web/controller/GreetControllerIntegrationTest.java
+++ b/spring-mvc-java/src/test/java/com/baeldung/web/controller/GreetControllerIntegrationTest.java
@@ -32,7 +32,7 @@ public class GreetControllerIntegrationTest {
private MockMvc mockMvc;
- private static final String CONTENT_TYPE = "application/json;charset=UTF-8";
+ private static final String CONTENT_TYPE = "application/json";
@Before
public void setup() throws Exception {
diff --git a/spring-mvc-java/src/test/java/com/baeldung/web/controller/GreetControllerUnitTest.java b/spring-mvc-java/src/test/java/com/baeldung/web/controller/GreetControllerUnitTest.java
index 0475bd933d..eacd256438 100644
--- a/spring-mvc-java/src/test/java/com/baeldung/web/controller/GreetControllerUnitTest.java
+++ b/spring-mvc-java/src/test/java/com/baeldung/web/controller/GreetControllerUnitTest.java
@@ -16,7 +16,7 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders;
public class GreetControllerUnitTest {
private MockMvc mockMvc;
- private static final String CONTENT_TYPE = "application/json;charset=UTF-8";
+ private static final String CONTENT_TYPE = "application/json";
@Before
public void setup() {
diff --git a/spring-mvc-velocity/src/test/java/org/baeldung/SpringContextTest.java b/spring-mvc-velocity/src/test/java/org/baeldung/SpringContextTest.java
index 22a4486aa7..a27cacba53 100644
--- a/spring-mvc-velocity/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-mvc-velocity/src/test/java/org/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-mvc-webflow/src/main/java/org/baeldung/servlet/WebInitializer.java b/spring-mvc-webflow/src/main/java/org/baeldung/servlet/WebInitializer.java
index 2f52cad804..fc0adb558d 100644
--- a/spring-mvc-webflow/src/main/java/org/baeldung/servlet/WebInitializer.java
+++ b/spring-mvc-webflow/src/main/java/org/baeldung/servlet/WebInitializer.java
@@ -1,9 +1,9 @@
-package org.baeldung.servlet;
+package com.baeldung.servlet;
import javax.servlet.ServletRegistration.Dynamic;
-import org.baeldung.spring.WebFlowConfig;
-import org.baeldung.spring.WebMvcConfig;
+import com.baeldung.spring.WebFlowConfig;
+import com.baeldung.spring.WebMvcConfig;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
diff --git a/spring-mvc-webflow/src/main/java/org/baeldung/spring/WebFlowConfig.java b/spring-mvc-webflow/src/main/java/org/baeldung/spring/WebFlowConfig.java
index 3d2de2a014..d42996bbaf 100644
--- a/spring-mvc-webflow/src/main/java/org/baeldung/spring/WebFlowConfig.java
+++ b/spring-mvc-webflow/src/main/java/org/baeldung/spring/WebFlowConfig.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring;
+package com.baeldung.spring;
import java.util.Collections;
diff --git a/spring-mvc-webflow/src/main/java/org/baeldung/spring/WebMvcConfig.java b/spring-mvc-webflow/src/main/java/org/baeldung/spring/WebMvcConfig.java
index 46bf322f1d..acaa11638d 100644
--- a/spring-mvc-webflow/src/main/java/org/baeldung/spring/WebMvcConfig.java
+++ b/spring-mvc-webflow/src/main/java/org/baeldung/spring/WebMvcConfig.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring;
+package com.baeldung.spring;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
diff --git a/spring-mvc-webflow/src/test/java/org/baeldung/SpringContextTest.java b/spring-mvc-webflow/src/test/java/org/baeldung/SpringContextTest.java
index 122dc18bad..d58ddae6b8 100644
--- a/spring-mvc-webflow/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-mvc-webflow/src/test/java/org/baeldung/SpringContextTest.java
@@ -1,7 +1,7 @@
-package org.baeldung;
+package com.baeldung;
-import org.baeldung.spring.WebFlowConfig;
-import org.baeldung.spring.WebMvcConfig;
+import com.baeldung.spring.WebFlowConfig;
+import com.baeldung.spring.WebMvcConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
diff --git a/spring-mvc-xml/pom.xml b/spring-mvc-xml/pom.xml
index c389e41e29..4812d5c979 100644
--- a/spring-mvc-xml/pom.xml
+++ b/spring-mvc-xml/pom.xml
@@ -92,8 +92,8 @@
${spring-boot.version}test
-
-
+
+
org.crashubcrash.embed.spring
@@ -101,16 +101,22 @@
org.crashub
- crash.cli
+ crash.cli${crash.version}org.crashubcrash.connectors.telnet${crash.version}
+
+
+ log4j
+ log4j
+
+
-
-
+
+
org.codehaus.groovygroovy
@@ -161,7 +167,7 @@
1.6.1
-
+
1.3.23.0.0-rc-3
diff --git a/spring-mvc-xml/src/test/java/org/baeldung/SpringContextTest.java b/spring-mvc-xml/src/test/java/org/baeldung/SpringContextTest.java
index 27dcb83bd4..62e34859ee 100644
--- a/spring-mvc-xml/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-mvc-xml/src/test/java/org/baeldung/SpringContextTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-reactor/src/main/java/com/baeldung/Config.java b/spring-reactor/src/main/java/com/baeldung/reactorbus/Config.java
similarity index 76%
rename from spring-reactor/src/main/java/com/baeldung/Config.java
rename to spring-reactor/src/main/java/com/baeldung/reactorbus/Config.java
index 28f40dda02..f849215dc4 100644
--- a/spring-reactor/src/main/java/com/baeldung/Config.java
+++ b/spring-reactor/src/main/java/com/baeldung/reactorbus/Config.java
@@ -1,8 +1,7 @@
-package com.baeldung;
+package com.baeldung.reactorbus;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-
import reactor.Environment;
import reactor.bus.EventBus;
@@ -10,13 +9,12 @@ import reactor.bus.EventBus;
public class Config {
@Bean
- Environment env() {
+ public Environment env() {
return Environment.initializeIfEmpty().assignErrorJournal();
}
@Bean
- EventBus createEventBus(Environment env) {
+ public EventBus createEventBus(Environment env) {
return EventBus.create(env, Environment.THREAD_POOL);
}
-
}
diff --git a/spring-reactor/src/main/java/com/baeldung/Application.java b/spring-reactor/src/main/java/com/baeldung/reactorbus/NotificationApplication.java
similarity index 52%
rename from spring-reactor/src/main/java/com/baeldung/Application.java
rename to spring-reactor/src/main/java/com/baeldung/reactorbus/NotificationApplication.java
index 9030d41d26..b315e6ce25 100644
--- a/spring-reactor/src/main/java/com/baeldung/Application.java
+++ b/spring-reactor/src/main/java/com/baeldung/reactorbus/NotificationApplication.java
@@ -1,24 +1,16 @@
-package com.baeldung;
+package com.baeldung.reactorbus;
+import com.baeldung.reactorbus.consumer.NotificationConsumer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
-
-import com.baeldung.consumer.NotificationConsumer;
-
+import org.springframework.boot.autoconfigure.SpringBootApplication;
import reactor.bus.EventBus;
import static reactor.bus.selector.Selectors.$;
-@Configuration
-@EnableAutoConfiguration
-@ComponentScan
-@Import(Config.class)
-public class Application implements CommandLineRunner {
+@SpringBootApplication
+public class NotificationApplication implements CommandLineRunner {
@Autowired
private EventBus eventBus;
@@ -32,7 +24,6 @@ public class Application implements CommandLineRunner {
}
public static void main(String[] args) {
- SpringApplication.run(Application.class, args);
+ SpringApplication.run(NotificationApplication.class, args);
}
-
}
diff --git a/spring-reactor/src/main/java/com/baeldung/consumer/NotificationConsumer.java b/spring-reactor/src/main/java/com/baeldung/reactorbus/consumer/NotificationConsumer.java
similarity index 80%
rename from spring-reactor/src/main/java/com/baeldung/consumer/NotificationConsumer.java
rename to spring-reactor/src/main/java/com/baeldung/reactorbus/consumer/NotificationConsumer.java
index ca6a5b4303..d9d2586187 100644
--- a/spring-reactor/src/main/java/com/baeldung/consumer/NotificationConsumer.java
+++ b/spring-reactor/src/main/java/com/baeldung/reactorbus/consumer/NotificationConsumer.java
@@ -1,10 +1,10 @@
-package com.baeldung.consumer;
+package com.baeldung.reactorbus.consumer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-import com.baeldung.doman.NotificationData;
-import com.baeldung.service.NotificationService;
+import com.baeldung.reactorbus.domain.NotificationData;
+import com.baeldung.reactorbus.service.NotificationService;
import reactor.bus.Event;
import reactor.fn.Consumer;
diff --git a/spring-reactor/src/main/java/com/baeldung/controller/NotificationController.java b/spring-reactor/src/main/java/com/baeldung/reactorbus/controller/NotificationController.java
similarity index 89%
rename from spring-reactor/src/main/java/com/baeldung/controller/NotificationController.java
rename to spring-reactor/src/main/java/com/baeldung/reactorbus/controller/NotificationController.java
index 8665f247b0..62a7b38662 100644
--- a/spring-reactor/src/main/java/com/baeldung/controller/NotificationController.java
+++ b/spring-reactor/src/main/java/com/baeldung/reactorbus/controller/NotificationController.java
@@ -1,11 +1,11 @@
-package com.baeldung.controller;
+package com.baeldung.reactorbus.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
-import com.baeldung.doman.NotificationData;
+import com.baeldung.reactorbus.domain.NotificationData;
import reactor.bus.Event;
import reactor.bus.EventBus;
diff --git a/spring-reactor/src/main/java/com/baeldung/doman/NotificationData.java b/spring-reactor/src/main/java/com/baeldung/reactorbus/domain/NotificationData.java
similarity index 94%
rename from spring-reactor/src/main/java/com/baeldung/doman/NotificationData.java
rename to spring-reactor/src/main/java/com/baeldung/reactorbus/domain/NotificationData.java
index d6d7b02949..65d3559541 100644
--- a/spring-reactor/src/main/java/com/baeldung/doman/NotificationData.java
+++ b/spring-reactor/src/main/java/com/baeldung/reactorbus/domain/NotificationData.java
@@ -1,4 +1,4 @@
-package com.baeldung.doman;
+package com.baeldung.reactorbus.domain;
public class NotificationData {
diff --git a/spring-reactor/src/main/java/com/baeldung/service/NotificationService.java b/spring-reactor/src/main/java/com/baeldung/reactorbus/service/NotificationService.java
similarity index 58%
rename from spring-reactor/src/main/java/com/baeldung/service/NotificationService.java
rename to spring-reactor/src/main/java/com/baeldung/reactorbus/service/NotificationService.java
index f653b2162f..dfcd03ed68 100644
--- a/spring-reactor/src/main/java/com/baeldung/service/NotificationService.java
+++ b/spring-reactor/src/main/java/com/baeldung/reactorbus/service/NotificationService.java
@@ -1,6 +1,6 @@
-package com.baeldung.service;
+package com.baeldung.reactorbus.service;
-import com.baeldung.doman.NotificationData;
+import com.baeldung.reactorbus.domain.NotificationData;
public interface NotificationService {
diff --git a/spring-reactor/src/main/java/com/baeldung/service/impl/NotificationServiceimpl.java b/spring-reactor/src/main/java/com/baeldung/reactorbus/service/impl/NotificationServiceimpl.java
similarity index 75%
rename from spring-reactor/src/main/java/com/baeldung/service/impl/NotificationServiceimpl.java
rename to spring-reactor/src/main/java/com/baeldung/reactorbus/service/impl/NotificationServiceimpl.java
index bf37741f6a..aa305caaad 100644
--- a/spring-reactor/src/main/java/com/baeldung/service/impl/NotificationServiceimpl.java
+++ b/spring-reactor/src/main/java/com/baeldung/reactorbus/service/impl/NotificationServiceimpl.java
@@ -1,9 +1,9 @@
-package com.baeldung.service.impl;
+package com.baeldung.reactorbus.service.impl;
import org.springframework.stereotype.Service;
-import com.baeldung.doman.NotificationData;
-import com.baeldung.service.NotificationService;
+import com.baeldung.reactorbus.domain.NotificationData;
+import com.baeldung.reactorbus.service.NotificationService;
@Service
public class NotificationServiceimpl implements NotificationService {
diff --git a/spring-reactor/src/test/java/com/baeldung/DataLoaderLiveTest.java b/spring-reactor/src/test/java/com/baeldung/DataLoaderLiveTest.java
deleted file mode 100644
index 5833bc277c..0000000000
--- a/spring-reactor/src/test/java/com/baeldung/DataLoaderLiveTest.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.baeldung;
-
-import org.junit.Test;
-import org.springframework.web.client.RestTemplate;
-
-public class DataLoaderLiveTest {
-
- @Test
- public void exampleTest() {
- RestTemplate restTemplate = new RestTemplate();
- restTemplate.getForObject("http://localhost:8080/startNotification/10", String.class);
- }
-
-}
diff --git a/spring-reactor/src/test/java/org/baeldung/SpringContextTest.java b/spring-reactor/src/test/java/com/baeldung/SpringContextTest.java
similarity index 71%
rename from spring-reactor/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-reactor/src/test/java/com/baeldung/SpringContextTest.java
index 5e68a8e64f..68b6018433 100644
--- a/spring-reactor/src/test/java/org/baeldung/SpringContextTest.java
+++ b/spring-reactor/src/test/java/com/baeldung/SpringContextTest.java
@@ -1,14 +1,14 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
-import com.baeldung.Application;
+import com.baeldung.reactorbus.NotificationApplication;
@RunWith(SpringRunner.class)
-@SpringBootTest(classes = Application.class)
+@SpringBootTest(classes = NotificationApplication.class)
public class SpringContextTest {
@Test
diff --git a/spring-reactor/src/test/java/com/baeldung/reactorbus/NotificationApplicationIntegrationTest.java b/spring-reactor/src/test/java/com/baeldung/reactorbus/NotificationApplicationIntegrationTest.java
new file mode 100644
index 0000000000..0adea21fd4
--- /dev/null
+++ b/spring-reactor/src/test/java/com/baeldung/reactorbus/NotificationApplicationIntegrationTest.java
@@ -0,0 +1,22 @@
+package com.baeldung.reactorbus;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.web.client.RestTemplate;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class NotificationApplicationIntegrationTest {
+
+ @LocalServerPort
+ private int port;
+
+ @Test
+ public void givenAppStarted_whenNotificationTasksSubmitted_thenProcessed() {
+ RestTemplate restTemplate = new RestTemplate();
+ restTemplate.getForObject("http://localhost:" + port + "/startNotification/10", String.class);
+ }
+}
diff --git a/spring-rest-http/pom.xml b/spring-rest-http/pom.xml
index c5c6b8d44c..32d2804220 100644
--- a/spring-rest-http/pom.xml
+++ b/spring-rest-http/pom.xml
@@ -41,12 +41,18 @@
org.springframework.bootspring-boot-starter-test
+
+ com.github.java-json-tools
+ json-patch
+ ${jsonpatch.version}
+ 1.4.9
+ 1.12
diff --git a/spring-rest-http/src/main/java/com/baeldung/CustomerSpringBootRestApplication.java b/spring-rest-http/src/main/java/com/baeldung/CustomerSpringBootRestApplication.java
new file mode 100644
index 0000000000..2995d4d0dc
--- /dev/null
+++ b/spring-rest-http/src/main/java/com/baeldung/CustomerSpringBootRestApplication.java
@@ -0,0 +1,12 @@
+package com.baeldung;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class CustomerSpringBootRestApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(CustomerSpringBootRestApplication.class, args);
+ }
+}
diff --git a/spring-rest-http/src/main/java/com/baeldung/config/MvcConfig.java b/spring-rest-http/src/main/java/com/baeldung/config/MvcConfig.java
index ea2c536757..6e8b41bbed 100644
--- a/spring-rest-http/src/main/java/com/baeldung/config/MvcConfig.java
+++ b/spring-rest-http/src/main/java/com/baeldung/config/MvcConfig.java
@@ -21,7 +21,7 @@ import java.util.List;
*/
@Configuration
@EnableWebMvc
-@ComponentScan({ "com.baeldung.web", "com.baeldung.requestmapping" })
+@ComponentScan({ "com.baeldung.web.controller.status", "com.baeldung.requestmapping" })
public class MvcConfig implements WebMvcConfigurer {
public MvcConfig() {
diff --git a/spring-rest-http/src/main/java/com/baeldung/model/Customer.java b/spring-rest-http/src/main/java/com/baeldung/model/Customer.java
new file mode 100644
index 0000000000..e65446c389
--- /dev/null
+++ b/spring-rest-http/src/main/java/com/baeldung/model/Customer.java
@@ -0,0 +1,79 @@
+package com.baeldung.model;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+public class Customer {
+ private String id;
+ private String telephone;
+ private List favorites;
+ private Map communicationPreferences;
+
+ public Customer() {
+ }
+
+ public Customer(String id, String telephone, List favorites, Map communicationPreferences) {
+ this(telephone, favorites, communicationPreferences);
+ this.id = id;
+ }
+
+ public Customer(String telephone, List favorites, Map communicationPreferences) {
+ this.telephone = telephone;
+ this.favorites = favorites;
+ this.communicationPreferences = communicationPreferences;
+ }
+
+ public static Customer fromCustomer(Customer customer) {
+ return new Customer(customer.getId(), customer.getTelephone(), customer.getFavorites(), customer.getCommunicationPreferences());
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getTelephone() {
+ return telephone;
+ }
+
+ public void setTelephone(String telephone) {
+ this.telephone = telephone;
+ }
+
+ public Map getCommunicationPreferences() {
+ return communicationPreferences;
+ }
+
+ public void setCommunicationPreferences(Map communicationPreferences) {
+ this.communicationPreferences = communicationPreferences;
+ }
+
+ public List getFavorites() {
+ return favorites;
+ }
+
+ public void setFavorites(List favorites) {
+ this.favorites = favorites;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof Customer)) {
+ return false;
+ }
+ Customer customer = (Customer) o;
+ return Objects.equals(id, customer.id);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id);
+ }
+}
diff --git a/spring-rest-http/src/main/java/com/baeldung/service/CustomerIdGenerator.java b/spring-rest-http/src/main/java/com/baeldung/service/CustomerIdGenerator.java
new file mode 100644
index 0000000000..f4afb79852
--- /dev/null
+++ b/spring-rest-http/src/main/java/com/baeldung/service/CustomerIdGenerator.java
@@ -0,0 +1,6 @@
+package com.baeldung.service;
+
+public interface CustomerIdGenerator {
+ int generateNextId();
+}
+
diff --git a/spring-rest-http/src/main/java/com/baeldung/service/CustomerService.java b/spring-rest-http/src/main/java/com/baeldung/service/CustomerService.java
new file mode 100644
index 0000000000..51a6bc7474
--- /dev/null
+++ b/spring-rest-http/src/main/java/com/baeldung/service/CustomerService.java
@@ -0,0 +1,14 @@
+package com.baeldung.service;
+
+import com.baeldung.model.Customer;
+
+import java.util.Optional;
+
+public interface CustomerService {
+
+ Customer createCustomer(Customer customer);
+
+ Optional findCustomer(String id);
+
+ void updateCustomer(Customer customer);
+}
diff --git a/spring-rest-http/src/main/java/com/baeldung/service/impl/CustomerIdGeneratorImpl.java b/spring-rest-http/src/main/java/com/baeldung/service/impl/CustomerIdGeneratorImpl.java
new file mode 100644
index 0000000000..471fe880b8
--- /dev/null
+++ b/spring-rest-http/src/main/java/com/baeldung/service/impl/CustomerIdGeneratorImpl.java
@@ -0,0 +1,17 @@
+package com.baeldung.service.impl;
+
+import com.baeldung.service.CustomerIdGenerator;
+
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+@Component
+public class CustomerIdGeneratorImpl implements CustomerIdGenerator {
+ private static final AtomicInteger SEQUENCE = new AtomicInteger();
+
+ @Override
+ public int generateNextId() {
+ return SEQUENCE.incrementAndGet();
+ }
+}
diff --git a/spring-rest-http/src/main/java/com/baeldung/service/impl/CustomerServiceImpl.java b/spring-rest-http/src/main/java/com/baeldung/service/impl/CustomerServiceImpl.java
new file mode 100644
index 0000000000..c57e95deed
--- /dev/null
+++ b/spring-rest-http/src/main/java/com/baeldung/service/impl/CustomerServiceImpl.java
@@ -0,0 +1,42 @@
+package com.baeldung.service.impl;
+
+import com.baeldung.model.Customer;
+import com.baeldung.service.CustomerIdGenerator;
+import com.baeldung.service.CustomerService;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+@Service
+public class CustomerServiceImpl implements CustomerService {
+ private CustomerIdGenerator customerIdGenerator;
+ private List customers = new ArrayList<>();
+
+ @Autowired
+ public CustomerServiceImpl(CustomerIdGenerator customerIdGenerator) {
+ this.customerIdGenerator = customerIdGenerator;
+ }
+
+ @Override
+ public Customer createCustomer(Customer customer) {
+ customer.setId(Integer.toString(customerIdGenerator.generateNextId()));
+ customers.add(customer);
+ return customer;
+ }
+
+ @Override
+ public Optional findCustomer(String id) {
+ return customers.stream()
+ .filter(customer -> customer.getId().equals(id))
+ .findFirst();
+ }
+
+ @Override
+ public void updateCustomer(Customer customer) {
+ customers.set(customers.indexOf(customer), customer);
+ }
+}
diff --git a/spring-rest-http/src/main/java/com/baeldung/web/controller/customer/CustomerRestController.java b/spring-rest-http/src/main/java/com/baeldung/web/controller/customer/CustomerRestController.java
new file mode 100644
index 0000000000..edae10de27
--- /dev/null
+++ b/spring-rest-http/src/main/java/com/baeldung/web/controller/customer/CustomerRestController.java
@@ -0,0 +1,69 @@
+package com.baeldung.web.controller.customer;
+
+import com.baeldung.model.Customer;
+import com.baeldung.service.CustomerService;
+import com.baeldung.web.exception.CustomerNotFoundException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.github.fge.jsonpatch.JsonPatch;
+import com.github.fge.jsonpatch.JsonPatchException;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PatchMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
+
+import java.net.URI;
+
+import javax.validation.Valid;
+
+@RestController
+@RequestMapping(value = "/customers")
+public class CustomerRestController {
+ private CustomerService customerService;
+ private ObjectMapper objectMapper = new ObjectMapper();
+
+ @Autowired
+ public CustomerRestController(CustomerService customerService) {
+ this.customerService = customerService;
+ }
+
+ @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
+ public ResponseEntity createCustomer(@RequestBody Customer customer) {
+ Customer customerCreated = customerService.createCustomer(customer);
+ URI location = ServletUriComponentsBuilder.fromCurrentRequest()
+ .path("/{id}")
+ .buildAndExpand(customerCreated.getId())
+ .toUri();
+ return ResponseEntity.created(location).build();
+ }
+
+ @PatchMapping(path = "/{id}", consumes = "application/json-patch+json")
+ public ResponseEntity updateCustomer(@PathVariable String id,
+ @RequestBody JsonPatch patch) {
+ try {
+ Customer customer = customerService.findCustomer(id).orElseThrow(CustomerNotFoundException::new);
+ Customer customerPatched = applyPatchToCustomer(patch, customer);
+ customerService.updateCustomer(customerPatched);
+
+ return ResponseEntity.ok(customerPatched);
+ } catch (CustomerNotFoundException e) {
+ return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
+ } catch (JsonPatchException | JsonProcessingException e) {
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
+ }
+ }
+
+ private Customer applyPatchToCustomer(JsonPatch patch, Customer targetCustomer) throws JsonPatchException, JsonProcessingException {
+ JsonNode patched = patch.apply(objectMapper.convertValue(targetCustomer, JsonNode.class));
+ return objectMapper.treeToValue(patched, Customer.class);
+ }
+}
diff --git a/spring-rest-http/src/main/java/com/baeldung/web/exception/CustomerNotFoundException.java b/spring-rest-http/src/main/java/com/baeldung/web/exception/CustomerNotFoundException.java
new file mode 100644
index 0000000000..c843696402
--- /dev/null
+++ b/spring-rest-http/src/main/java/com/baeldung/web/exception/CustomerNotFoundException.java
@@ -0,0 +1,5 @@
+package com.baeldung.web.exception;
+
+public class CustomerNotFoundException extends RuntimeException {
+
+}
diff --git a/spring-rest-http/src/test/java/com/baeldung/service/impl/CustomerIdGeneratorImplUnitTest.java b/spring-rest-http/src/test/java/com/baeldung/service/impl/CustomerIdGeneratorImplUnitTest.java
new file mode 100644
index 0000000000..a855c1cda2
--- /dev/null
+++ b/spring-rest-http/src/test/java/com/baeldung/service/impl/CustomerIdGeneratorImplUnitTest.java
@@ -0,0 +1,17 @@
+package com.baeldung.service.impl;
+
+import com.baeldung.service.CustomerIdGenerator;
+
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class CustomerIdGeneratorImplUnitTest {
+
+ @Test
+ public void givenIdGeneratedPreviously_whenGenerated_thenIdIsIncremented(){
+ CustomerIdGenerator customerIdGenerator = new CustomerIdGeneratorImpl();
+ int firstId = customerIdGenerator.generateNextId();
+ assertThat(customerIdGenerator.generateNextId()).isEqualTo(++firstId);
+ }
+}
diff --git a/spring-rest-http/src/test/java/com/baeldung/service/impl/CustomerServiceImplUnitTest.java b/spring-rest-http/src/test/java/com/baeldung/service/impl/CustomerServiceImplUnitTest.java
new file mode 100644
index 0000000000..27f0b35714
--- /dev/null
+++ b/spring-rest-http/src/test/java/com/baeldung/service/impl/CustomerServiceImplUnitTest.java
@@ -0,0 +1,94 @@
+package com.baeldung.service.impl;
+
+
+import com.baeldung.model.Customer;
+import com.baeldung.service.CustomerIdGenerator;
+import com.baeldung.service.CustomerService;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+import static com.baeldung.model.Customer.fromCustomer;
+import static java.util.Arrays.asList;
+import static java.util.Optional.empty;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.BDDMockito.given;
+
+@RunWith(MockitoJUnitRunner.class)
+public class CustomerServiceImplUnitTest {
+
+ @Mock
+ private CustomerIdGenerator mockCustomerIdGenerator;
+
+ private CustomerService customerService;
+
+ @Before
+ public void setup() {
+ customerService = new CustomerServiceImpl(mockCustomerIdGenerator);
+ }
+
+ @Test
+ public void whenCustomerIsCreated_thenNewCustomerDetailsAreCorrect() {
+ Map communicationPreferences = new HashMap<>();
+ communicationPreferences.put("post", true);
+ communicationPreferences.put("email", true);
+ Customer customer = new Customer("001-555-1234", asList("Milk", "Eggs"), communicationPreferences);
+ given(mockCustomerIdGenerator.generateNextId()).willReturn(1);
+
+ Customer newCustomer = customerService.createCustomer(customer);
+
+ assertThat(newCustomer.getId()).isEqualTo("1");
+ assertThat(newCustomer.getTelephone()).isEqualTo("001-555-1234");
+ assertThat(newCustomer.getFavorites()).containsExactly("Milk", "Eggs");
+ assertThat(newCustomer.getCommunicationPreferences()).isEqualTo(communicationPreferences);
+ }
+
+ @Test
+ public void givenNonExistentCustomer_whenCustomerIsLookedUp_thenCustomerCanNotBeFound() {
+ assertThat(customerService.findCustomer("CUST12345")).isEqualTo(empty());
+ }
+
+ @Test
+ public void whenCustomerIsCreated_thenCustomerCanBeFound() {
+ Map communicationPreferences = new HashMap<>();
+ communicationPreferences.put("post", true);
+ communicationPreferences.put("email", true);
+ Customer customer = new Customer("001-555-1234", asList("Milk", "Eggs"), communicationPreferences);
+ given(mockCustomerIdGenerator.generateNextId()).willReturn(7890);
+
+ customerService.createCustomer(customer);
+ Customer lookedUpCustomer = customerService.findCustomer("7890").get();
+
+ assertThat(lookedUpCustomer.getId()).isEqualTo("7890");
+ assertThat(lookedUpCustomer.getTelephone()).isEqualTo("001-555-1234");
+ assertThat(lookedUpCustomer.getFavorites()).containsExactly("Milk", "Eggs");
+ assertThat(lookedUpCustomer.getCommunicationPreferences()).isEqualTo(communicationPreferences);
+ }
+
+ @Test
+ public void whenCustomerUpdated_thenDetailsUpdatedCorrectly() {
+ given(mockCustomerIdGenerator.generateNextId()).willReturn(7890);
+ Map communicationPreferences = new HashMap<>();
+ communicationPreferences.put("post", true);
+ communicationPreferences.put("email", true);
+ Customer customer = new Customer("001-555-1234", asList("Milk", "Eggs"), communicationPreferences);
+ Customer newCustomer = customerService.createCustomer(customer);
+
+ Customer customerWithUpdates = fromCustomer(newCustomer);
+ customerWithUpdates.setTelephone("001-555-6789");
+ customerService.updateCustomer(customerWithUpdates);
+ Customer lookedUpCustomer = customerService.findCustomer("7890").get();
+
+ assertThat(lookedUpCustomer.getId()).isEqualTo("7890");
+ assertThat(lookedUpCustomer.getTelephone()).isEqualTo("001-555-6789");
+ assertThat(lookedUpCustomer.getFavorites()).containsExactly("Milk", "Eggs");
+ assertThat(lookedUpCustomer.getCommunicationPreferences()).isEqualTo(communicationPreferences);
+ }
+}
\ No newline at end of file
diff --git a/spring-rest-http/src/test/java/com/baeldung/web/controller/customer/CustomerRestControllerIntegrationTest.java b/spring-rest-http/src/test/java/com/baeldung/web/controller/customer/CustomerRestControllerIntegrationTest.java
new file mode 100644
index 0000000000..535bcb1904
--- /dev/null
+++ b/spring-rest-http/src/test/java/com/baeldung/web/controller/customer/CustomerRestControllerIntegrationTest.java
@@ -0,0 +1,72 @@
+package com.baeldung.web.controller.customer;
+
+import com.baeldung.model.Customer;
+import com.baeldung.service.CustomerService;
+
+import org.junit.Before;
+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.boot.test.web.client.TestRestTemplate;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import static java.util.Collections.emptyList;
+import static org.assertj.core.api.Assertions.assertThat;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class CustomerRestControllerIntegrationTest {
+
+ @Autowired
+ private CustomerService customerService;
+
+ @Autowired
+ private TestRestTemplate testRestTemplate;
+
+ @Before
+ public void setup() {
+ testRestTemplate.getRestTemplate().setRequestFactory(new HttpComponentsClientHttpRequestFactory());
+ }
+
+ @Test
+ public void givenExistingCustomer_whenPatched_thenOnlyPatchedFieldsUpdated() {
+ Map communicationPreferences = new HashMap<>();
+ communicationPreferences.put("post", true);
+ communicationPreferences.put("email", true);
+ Customer newCustomer = new Customer("001-555-1234", Arrays.asList("Milk", "Eggs"),
+ communicationPreferences);
+ Customer customer = customerService.createCustomer(newCustomer);
+
+
+ String patchBody = "[ { \"op\": \"replace\", \"path\": \"/telephone\", \"value\": \"001-555-5678\" },\n"
+ + "{\"op\": \"add\", \"path\": \"/favorites/0\", \"value\": \"Bread\" }]";
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.valueOf("application/json-patch+json"));
+ ResponseEntity patchResponse
+ = testRestTemplate.exchange("/customers/{id}",
+ HttpMethod.PATCH,
+ new HttpEntity<>(patchBody, headers),
+ Customer.class,
+ customer.getId());
+
+ Customer customerPatched = patchResponse.getBody();
+ assertThat(patchResponse.getStatusCode()).isEqualTo(HttpStatus.OK);
+ assertThat(customerPatched.getId()).isEqualTo(customer.getId());
+ assertThat(customerPatched.getTelephone()).isEqualTo("001-555-5678");
+ assertThat(customerPatched.getCommunicationPreferences().get("post")).isTrue();
+ assertThat(customerPatched.getCommunicationPreferences().get("email")).isTrue();
+ assertThat(customerPatched.getFavorites()).containsExactly("Bread", "Milk", "Eggs");
+ }
+}
diff --git a/spring-rest-http/src/test/java/com/baeldung/web/controller/customer/CustomerRestControllerUnitTest.java b/spring-rest-http/src/test/java/com/baeldung/web/controller/customer/CustomerRestControllerUnitTest.java
new file mode 100644
index 0000000000..6b1293e2c1
--- /dev/null
+++ b/spring-rest-http/src/test/java/com/baeldung/web/controller/customer/CustomerRestControllerUnitTest.java
@@ -0,0 +1,101 @@
+package com.baeldung.web.controller.customer;
+
+import com.baeldung.model.Customer;
+import com.baeldung.service.CustomerService;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+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.boot.test.mock.mockito.MockBean;
+import org.springframework.context.ApplicationContext;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static java.util.Arrays.asList;
+import static java.util.Optional.empty;
+import static java.util.Optional.of;
+import static org.hamcrest.CoreMatchers.is;
+import static org.mockito.BDDMockito.given;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrlPattern;
+import static org.springframework.http.MediaType.APPLICATION_JSON;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+@AutoConfigureMockMvc
+public class CustomerRestControllerUnitTest {
+
+ private static final String APPLICATION_JSON_PATCH_JSON = "application/json-patch+json";
+
+ @Autowired
+ private MockMvc mvc;
+
+ @MockBean
+ private CustomerService mockCustomerService;
+
+ @Autowired
+ ApplicationContext context;
+
+ @Test
+ public void whenCustomerCreated_then201ReturnedWithNewCustomerLocation() throws Exception {
+ Map communicationPreferences = new HashMap<>();
+ communicationPreferences.put("post", true);
+ communicationPreferences.put("email", true);
+ Customer customer = new Customer("001-555-1234", asList("Milk", "Eggs"), communicationPreferences);
+
+ Customer persistedCustomer = Customer.fromCustomer(customer);
+ persistedCustomer.setId("1");
+
+ given(mockCustomerService.createCustomer(customer)).willReturn(persistedCustomer);
+
+ String createCustomerRequestBody = "{"
+ + "\"telephone\": \"001-555-1234\",\n"
+ + "\"favorites\": [\"Milk\", \"Eggs\"],\n"
+ + "\"communicationPreferences\": {\"post\":true, \"email\":true}\n"
+ + "}";
+ mvc.perform(post("/customers")
+ .contentType(APPLICATION_JSON)
+ .content(createCustomerRequestBody))
+ .andExpect(status().isCreated())
+ .andExpect(redirectedUrlPattern("http://*/customers/1"));
+ }
+
+ @Test
+ public void givenNonExistentCustomer_whenPatched_then404Returned() throws Exception {
+ given(mockCustomerService.findCustomer("1")).willReturn(empty());
+
+ String patchInstructions = "[{\"op\":\"replace\",\"path\": \"/telephone\",\"value\":\"001-555-5678\"}]";
+ mvc.perform(patch("/customers/1")
+ .contentType(APPLICATION_JSON_PATCH_JSON)
+ .content(patchInstructions))
+ .andExpect(status().isNotFound());
+ }
+
+ @Test
+ public void givenExistingCustomer_whenPatched_thenReturnPatchedCustomer() throws Exception {
+ Map communicationPreferences = new HashMap<>();
+ communicationPreferences.put("post", true);
+ communicationPreferences.put("email", true);
+ Customer customer = new Customer("1", "001-555-1234", asList("Milk", "Eggs"), communicationPreferences);
+
+ given(mockCustomerService.findCustomer("1")).willReturn(of(customer));
+
+ String patchInstructions = "[{\"op\":\"replace\",\"path\": \"/telephone\",\"value\":\"001-555-5678\"}]";
+ mvc.perform(patch("/customers/1")
+ .contentType(APPLICATION_JSON_PATCH_JSON)
+ .content(patchInstructions))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.id", is("1")))
+ .andExpect(jsonPath("$.telephone", is("001-555-5678")))
+ .andExpect(jsonPath("$.favorites", is(asList("Milk", "Eggs"))))
+ .andExpect(jsonPath("$.communicationPreferences", is(communicationPreferences)));
+ }
+}
diff --git a/spring-rest-query-language/pom.xml b/spring-rest-query-language/pom.xml
index 25b149367e..2423528743 100644
--- a/spring-rest-query-language/pom.xml
+++ b/spring-rest-query-language/pom.xml
@@ -206,15 +206,9 @@
test
-
-
-
-
-
-
org.hamcrest
- hamcrest-library
+ hamcresttest
diff --git a/spring-rest-simple/pom.xml b/spring-rest-simple/pom.xml
index 59f7a94b8d..291053c87f 100644
--- a/spring-rest-simple/pom.xml
+++ b/spring-rest-simple/pom.xml
@@ -139,12 +139,7 @@
org.hamcrest
- hamcrest-core
- test
-
-
- org.hamcrest
- hamcrest-library
+ hamcresttest
diff --git a/spring-rest-testing/pom.xml b/spring-rest-testing/pom.xml
index dcd8b677be..d807459cad 100644
--- a/spring-rest-testing/pom.xml
+++ b/spring-rest-testing/pom.xml
@@ -177,14 +177,9 @@
test
-
-
-
-
-
org.hamcrest
- hamcrest-library
+ hamcresttest
diff --git a/spring-resttemplate/pom.xml b/spring-resttemplate/pom.xml
index 138fde3b45..05660f5210 100644
--- a/spring-resttemplate/pom.xml
+++ b/spring-resttemplate/pom.xml
@@ -130,12 +130,7 @@
org.hamcrest
- hamcrest-core
- test
-
-
- org.hamcrest
- hamcrest-library
+ hamcresttest
diff --git a/spring-scheduling/README.md b/spring-scheduling/README.md
index 2e3bb2b5e5..bf34fb60de 100644
--- a/spring-scheduling/README.md
+++ b/spring-scheduling/README.md
@@ -1,6 +1,7 @@
### Relevant articles:
-- [A Guide to the Spring Task Scheduler](http://www.baeldung.com/spring-task-scheduler)
+- [A Guide to the Spring Task Scheduler](https://www.baeldung.com/spring-task-scheduler)
- [The @Scheduled Annotation in Spring](https://www.baeldung.com/spring-scheduled-tasks)
-- [Guide to Spring Retry](http://www.baeldung.com/spring-retry)
-- [How To Do @Async in Spring](http://www.baeldung.com/spring-async)
+- [Guide to Spring Retry](https://www.baeldung.com/spring-retry)
+- [How To Do @Async in Spring](https://www.baeldung.com/spring-async)
+- [Conditionally Enable Scheduled Jobs in Spring](https://www.baeldung.com/spring-scheduled-enabled-conditionally)
diff --git a/spring-scheduling/pom.xml b/spring-scheduling/pom.xml
index 8726fea438..b27f33196d 100644
--- a/spring-scheduling/pom.xml
+++ b/spring-scheduling/pom.xml
@@ -27,6 +27,10 @@
org.springframeworkspring-aspects
+
+ org.springframework.boot
+ spring-boot-starter-web
+ javax.annotationjavax.annotation-api
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduleJobsByProfile.java b/spring-scheduling/src/main/java/com/baeldung/scheduling/conditional/ScheduleJobsByProfile.java
similarity index 91%
rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduleJobsByProfile.java
rename to spring-scheduling/src/main/java/com/baeldung/scheduling/conditional/ScheduleJobsByProfile.java
index 33cd44331f..7783d0e6ff 100644
--- a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduleJobsByProfile.java
+++ b/spring-scheduling/src/main/java/com/baeldung/scheduling/conditional/ScheduleJobsByProfile.java
@@ -1,4 +1,4 @@
-package com.baeldung.scheduling;
+package com.baeldung.scheduling.conditional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduledJob.java b/spring-scheduling/src/main/java/com/baeldung/scheduling/conditional/ScheduledJob.java
similarity index 91%
rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduledJob.java
rename to spring-scheduling/src/main/java/com/baeldung/scheduling/conditional/ScheduledJob.java
index df7cefcd3c..b56cb9ed5b 100644
--- a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduledJob.java
+++ b/spring-scheduling/src/main/java/com/baeldung/scheduling/conditional/ScheduledJob.java
@@ -1,4 +1,4 @@
-package com.baeldung.scheduling;
+package com.baeldung.scheduling.conditional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduledJobsWithBoolean.java b/spring-scheduling/src/main/java/com/baeldung/scheduling/conditional/ScheduledJobsWithBoolean.java
similarity index 94%
rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduledJobsWithBoolean.java
rename to spring-scheduling/src/main/java/com/baeldung/scheduling/conditional/ScheduledJobsWithBoolean.java
index b03de61641..69c0efb7b2 100644
--- a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduledJobsWithBoolean.java
+++ b/spring-scheduling/src/main/java/com/baeldung/scheduling/conditional/ScheduledJobsWithBoolean.java
@@ -1,4 +1,4 @@
-package com.baeldung.scheduling;
+package com.baeldung.scheduling.conditional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduledJobsWithConditional.java b/spring-scheduling/src/main/java/com/baeldung/scheduling/conditional/ScheduledJobsWithConditional.java
similarity index 93%
rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduledJobsWithConditional.java
rename to spring-scheduling/src/main/java/com/baeldung/scheduling/conditional/ScheduledJobsWithConditional.java
index 081c8d990a..2a90300c20 100644
--- a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduledJobsWithConditional.java
+++ b/spring-scheduling/src/main/java/com/baeldung/scheduling/conditional/ScheduledJobsWithConditional.java
@@ -1,4 +1,4 @@
-package com.baeldung.scheduling;
+package com.baeldung.scheduling.conditional;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduledJobsWithExpression.java b/spring-scheduling/src/main/java/com/baeldung/scheduling/conditional/ScheduledJobsWithExpression.java
similarity index 93%
rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduledJobsWithExpression.java
rename to spring-scheduling/src/main/java/com/baeldung/scheduling/conditional/ScheduledJobsWithExpression.java
index 577a01f241..4842e649c7 100644
--- a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/scheduling/ScheduledJobsWithExpression.java
+++ b/spring-scheduling/src/main/java/com/baeldung/scheduling/conditional/ScheduledJobsWithExpression.java
@@ -1,4 +1,4 @@
-package com.baeldung.scheduling;
+package com.baeldung.scheduling.conditional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/scheduling/SchedulingApplication.java b/spring-scheduling/src/main/java/com/baeldung/scheduling/conditional/SchedulingApplication.java
similarity index 89%
rename from spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/scheduling/SchedulingApplication.java
rename to spring-scheduling/src/main/java/com/baeldung/scheduling/conditional/SchedulingApplication.java
index 913e2137f8..4777230341 100644
--- a/spring-boot-modules/spring-boot-mvc/src/main/java/com/baeldung/scheduling/SchedulingApplication.java
+++ b/spring-scheduling/src/main/java/com/baeldung/scheduling/conditional/SchedulingApplication.java
@@ -1,4 +1,4 @@
-package com.baeldung.scheduling;
+package com.baeldung.scheduling.conditional;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-security-modules/pom.xml b/spring-security-modules/pom.xml
index 7de3009f47..49a0db03ed 100644
--- a/spring-security-modules/pom.xml
+++ b/spring-security-modules/pom.xml
@@ -21,17 +21,17 @@
spring-security-corsspring-security-kerberosspring-security-mvc
- spring-security-mvc-boot
+ spring-security-mvc-boot-1
+ spring-security-mvc-boot-2spring-security-mvc-customspring-security-mvc-digest-authspring-security-mvc-jsonview
- spring-security-mvc-ldap
+ spring-security-ldapspring-security-mvc-loginspring-security-mvc-persisted-remember-mespring-security-mvc-socketspring-security-oidcspring-security-react
-
spring-security-restspring-security-rest-basic-authspring-security-rest-custom
diff --git a/spring-security-modules/spring-security-cache-control/pom.xml b/spring-security-modules/spring-security-cache-control/pom.xml
index ff96ae78dd..acc37b41ef 100644
--- a/spring-security-modules/spring-security-cache-control/pom.xml
+++ b/spring-security-modules/spring-security-cache-control/pom.xml
@@ -42,12 +42,8 @@
org.hamcrest
- hamcrest-core
- test
-
-
- org.hamcrest
- hamcrest-library
+ hamcrest
+ ${hamcrest.version}test
diff --git a/spring-security-modules/spring-security-mvc-ldap/README.md b/spring-security-modules/spring-security-ldap/README.md
similarity index 100%
rename from spring-security-modules/spring-security-mvc-ldap/README.md
rename to spring-security-modules/spring-security-ldap/README.md
diff --git a/spring-security-modules/spring-security-mvc-ldap/pom.xml b/spring-security-modules/spring-security-ldap/pom.xml
similarity index 95%
rename from spring-security-modules/spring-security-mvc-ldap/pom.xml
rename to spring-security-modules/spring-security-ldap/pom.xml
index 2f227d7908..f5e8856648 100644
--- a/spring-security-modules/spring-security-mvc-ldap/pom.xml
+++ b/spring-security-modules/spring-security-ldap/pom.xml
@@ -2,9 +2,9 @@
4.0.0
- spring-security-mvc-ldap
+ spring-security-ldap0.1-SNAPSHOT
- spring-security-mvc-ldap
+ spring-security-ldapwar
diff --git a/spring-security-modules/spring-security-mvc-ldap/src/main/java/org/baeldung/SampleLDAPApplication.java b/spring-security-modules/spring-security-ldap/src/main/java/org/baeldung/SampleLDAPApplication.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-ldap/src/main/java/org/baeldung/SampleLDAPApplication.java
rename to spring-security-modules/spring-security-ldap/src/main/java/org/baeldung/SampleLDAPApplication.java
diff --git a/spring-security-modules/spring-security-mvc-ldap/src/main/java/org/baeldung/controller/MyController.java b/spring-security-modules/spring-security-ldap/src/main/java/org/baeldung/controller/MyController.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-ldap/src/main/java/org/baeldung/controller/MyController.java
rename to spring-security-modules/spring-security-ldap/src/main/java/org/baeldung/controller/MyController.java
diff --git a/spring-security-modules/spring-security-mvc-ldap/src/main/java/org/baeldung/security/SecurityConfig.java b/spring-security-modules/spring-security-ldap/src/main/java/org/baeldung/security/SecurityConfig.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-ldap/src/main/java/org/baeldung/security/SecurityConfig.java
rename to spring-security-modules/spring-security-ldap/src/main/java/org/baeldung/security/SecurityConfig.java
diff --git a/spring-security-modules/spring-security-mvc-ldap/src/main/resources/logback.xml b/spring-security-modules/spring-security-ldap/src/main/resources/logback.xml
similarity index 100%
rename from spring-security-modules/spring-security-mvc-ldap/src/main/resources/logback.xml
rename to spring-security-modules/spring-security-ldap/src/main/resources/logback.xml
diff --git a/spring-security-modules/spring-security-mvc-ldap/src/main/resources/static/css/bootstrap.min.css b/spring-security-modules/spring-security-ldap/src/main/resources/static/css/bootstrap.min.css
similarity index 100%
rename from spring-security-modules/spring-security-mvc-ldap/src/main/resources/static/css/bootstrap.min.css
rename to spring-security-modules/spring-security-ldap/src/main/resources/static/css/bootstrap.min.css
diff --git a/spring-security-modules/spring-security-mvc-ldap/src/main/resources/templates/error.html b/spring-security-modules/spring-security-ldap/src/main/resources/templates/error.html
similarity index 100%
rename from spring-security-modules/spring-security-mvc-ldap/src/main/resources/templates/error.html
rename to spring-security-modules/spring-security-ldap/src/main/resources/templates/error.html
diff --git a/spring-security-modules/spring-security-mvc-ldap/src/main/resources/templates/home.html b/spring-security-modules/spring-security-ldap/src/main/resources/templates/home.html
similarity index 100%
rename from spring-security-modules/spring-security-mvc-ldap/src/main/resources/templates/home.html
rename to spring-security-modules/spring-security-ldap/src/main/resources/templates/home.html
diff --git a/spring-security-modules/spring-security-mvc-ldap/src/main/resources/templates/login.html b/spring-security-modules/spring-security-ldap/src/main/resources/templates/login.html
similarity index 100%
rename from spring-security-modules/spring-security-mvc-ldap/src/main/resources/templates/login.html
rename to spring-security-modules/spring-security-ldap/src/main/resources/templates/login.html
diff --git a/spring-security-modules/spring-security-mvc-ldap/src/main/resources/users.ldif b/spring-security-modules/spring-security-ldap/src/main/resources/users.ldif
similarity index 100%
rename from spring-security-modules/spring-security-mvc-ldap/src/main/resources/users.ldif
rename to spring-security-modules/spring-security-ldap/src/main/resources/users.ldif
diff --git a/spring-security-modules/spring-security-mvc-ldap/src/main/resources/webSecurityConfig.xml b/spring-security-modules/spring-security-ldap/src/main/resources/webSecurityConfig.xml
similarity index 100%
rename from spring-security-modules/spring-security-mvc-ldap/src/main/resources/webSecurityConfig.xml
rename to spring-security-modules/spring-security-ldap/src/main/resources/webSecurityConfig.xml
diff --git a/spring-security-modules/spring-security-mvc-ldap/src/test/java/org/baeldung/SpringContextTest.java b/spring-security-modules/spring-security-ldap/src/test/java/org/baeldung/SpringContextTest.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-ldap/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-security-modules/spring-security-ldap/src/test/java/org/baeldung/SpringContextTest.java
diff --git a/spring-security-modules/spring-security-mvc-ldap/src/test/resources/.gitignore b/spring-security-modules/spring-security-ldap/src/test/resources/.gitignore
similarity index 100%
rename from spring-security-modules/spring-security-mvc-ldap/src/test/resources/.gitignore
rename to spring-security-modules/spring-security-ldap/src/test/resources/.gitignore
diff --git a/spring-security-modules/spring-security-mvc-boot/README.md b/spring-security-modules/spring-security-mvc-boot-1/README.md
similarity index 62%
rename from spring-security-modules/spring-security-mvc-boot/README.md
rename to spring-security-modules/spring-security-mvc-boot-1/README.md
index a1056cc130..f2c161d387 100644
--- a/spring-security-modules/spring-security-mvc-boot/README.md
+++ b/spring-security-modules/spring-security-mvc-boot-1/README.md
@@ -1,4 +1,4 @@
-## Spring Boot Security MVC
+## Spring Boot Security MVC - 1
This module contains articles about Spring Security with Spring MVC in Boot applications
@@ -9,13 +9,9 @@ The "REST With Spring" Classes: http://github.learnspringsecurity.com
- [A Custom Security Expression with Spring Security](https://www.baeldung.com/spring-security-create-new-custom-security-expression)
- [Custom AccessDecisionVoters in Spring Security](https://www.baeldung.com/spring-security-custom-voter)
- [Spring Security: Authentication with a Database-backed UserDetailsService](https://www.baeldung.com/spring-security-authentication-with-a-database)
-- [Two Login Pages with Spring Security](https://www.baeldung.com/spring-security-two-login-pages)
-- [Multiple Entry Points in Spring Security](https://www.baeldung.com/spring-security-multiple-entry-points)
-- [Multiple Authentication Providers in Spring Security](https://www.baeldung.com/spring-security-multiple-auth-providers)
-- [Granted Authority Versus Role in Spring Security](https://www.baeldung.com/spring-security-granted-authority-vs-role)
- [Spring Data with Spring Security](https://www.baeldung.com/spring-data-security)
+- [Granted Authority Versus Role in Spring Security](https://www.baeldung.com/spring-security-granted-authority-vs-role)
- [Spring Security – Whitelist IP Range](https://www.baeldung.com/spring-security-whitelist-ip-range)
- [Find the Registered Spring Security Filters](https://www.baeldung.com/spring-security-registered-filters)
-- [HTTPS using Self-Signed Certificate in Spring Boot](https://www.baeldung.com/spring-boot-https-self-signed-certificate)
-- [Spring Security: Exploring JDBC Authentication](https://www.baeldung.com/spring-security-jdbc-authentication)
+- More articles: [[next -->]](/../spring-security-mvc-boot-2)
diff --git a/spring-security-modules/spring-security-mvc-boot/WebContent/META-INF/MANIFEST.MF b/spring-security-modules/spring-security-mvc-boot-1/WebContent/META-INF/MANIFEST.MF
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/WebContent/META-INF/MANIFEST.MF
rename to spring-security-modules/spring-security-mvc-boot-1/WebContent/META-INF/MANIFEST.MF
diff --git a/spring-security-modules/spring-security-mvc-boot-1/pom.xml b/spring-security-modules/spring-security-mvc-boot-1/pom.xml
new file mode 100644
index 0000000000..7dfee200d4
--- /dev/null
+++ b/spring-security-modules/spring-security-mvc-boot-1/pom.xml
@@ -0,0 +1,235 @@
+
+
+ 4.0.0
+ spring-security-mvc-boot-1
+ 0.0.1-SNAPSHOT
+ spring-security-mvc-boot-1
+ war
+ Spring Security MVC Boot - 1
+
+
+ com.baeldung
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-2
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-tomcat
+
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+
+
+ org.thymeleaf.extras
+ thymeleaf-extras-springsecurity5
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.springframework.security
+ spring-security-data
+
+
+ mysql
+ mysql-connector-java
+ runtime
+
+
+ com.h2database
+ h2
+
+
+ org.postgresql
+ postgresql
+ runtime
+
+
+ org.hamcrest
+ hamcrest
+ test
+
+
+ org.springframework
+ spring-test
+ test
+
+
+ org.springframework.security
+ spring-security-test
+ test
+
+
+ taglibs
+ standard
+ ${taglibs-standard.version}
+
+
+ org.springframework.security
+ spring-security-taglibs
+
+
+ org.springframework.security
+ spring-security-core
+
+
+ javax.servlet.jsp.jstl
+ jstl-api
+ ${jstl.version}
+
+
+ org.springframework.security
+ spring-security-config
+
+
+ org.springframework
+ spring-context-support
+
+
+ net.sf.ehcache
+ ehcache-core
+ ${ehcache-core.version}
+ jar
+
+
+
+
+
+
+ org.codehaus.cargo
+ cargo-maven2-plugin
+ ${cargo-maven2-plugin.version}
+
+ true
+
+ tomcat8x
+ embedded
+
+
+
+
+
+
+ 8082
+
+
+
+
+
+
+
+
+
+ live
+
+
+
+ org.codehaus.cargo
+ cargo-maven2-plugin
+
+
+ start-server
+ pre-integration-test
+
+ start
+
+
+
+ stop-server
+ post-integration-test
+
+ stop
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ integration-test
+
+ test
+
+
+
+ none
+
+
+ **/*LiveTest.java
+
+
+ cargo
+
+
+
+
+
+
+
+
+
+
+ entryPoints
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ integration-test
+
+ test
+
+
+
+ **/*LiveTest.java
+ **/*IntegrationTest.java
+ **/*IntTest.java
+
+
+ **/*EntryPointsTest.java
+
+
+
+
+
+
+ json
+
+
+
+
+
+
+
+
+
+ org.baeldung.custom.Application
+
+
+
+ 1.1.2
+ 1.6.1
+ 2.6.11
+
+
+
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/com/baeldung/AppConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/AppConfig.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/com/baeldung/AppConfig.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/AppConfig.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/com/baeldung/SpringSecurityConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/SpringSecurityConfig.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/com/baeldung/SpringSecurityConfig.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/SpringSecurityConfig.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/com/baeldung/data/repositories/TweetRepository.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/data/repositories/TweetRepository.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/com/baeldung/data/repositories/TweetRepository.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/data/repositories/TweetRepository.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/com/baeldung/data/repositories/UserRepository.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/data/repositories/UserRepository.java
similarity index 96%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/com/baeldung/data/repositories/UserRepository.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/data/repositories/UserRepository.java
index 9f13c3197e..5240c683e0 100644
--- a/spring-security-modules/spring-security-mvc-boot/src/main/java/com/baeldung/data/repositories/UserRepository.java
+++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/data/repositories/UserRepository.java
@@ -13,7 +13,6 @@ import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.baeldung.models.AppUser;
-import com.baeldung.models.Tweet;
public interface UserRepository extends CrudRepository {
AppUser findByUsername(String username);
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/com/baeldung/models/AppUser.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/models/AppUser.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/com/baeldung/models/AppUser.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/models/AppUser.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/com/baeldung/models/Tweet.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/models/Tweet.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/com/baeldung/models/Tweet.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/models/Tweet.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/com/baeldung/security/AppUserPrincipal.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/security/AppUserPrincipal.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/com/baeldung/security/AppUserPrincipal.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/security/AppUserPrincipal.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/com/baeldung/security/AuthenticationSuccessHandlerImpl.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/security/AuthenticationSuccessHandlerImpl.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/com/baeldung/security/AuthenticationSuccessHandlerImpl.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/security/AuthenticationSuccessHandlerImpl.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/com/baeldung/security/CustomUserDetailsService.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/security/CustomUserDetailsService.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/com/baeldung/security/CustomUserDetailsService.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/security/CustomUserDetailsService.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/com/baeldung/util/DummyContentUtil.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/util/DummyContentUtil.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/com/baeldung/util/DummyContentUtil.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/com/baeldung/util/DummyContentUtil.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/Application.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/Application.java
similarity index 84%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/Application.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/Application.java
index 2bd0da48d2..e051e5a853 100644
--- a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/Application.java
+++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/Application.java
@@ -3,9 +3,11 @@ package org.baeldung.custom;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.PropertySource;
@SpringBootApplication
+@ComponentScan("org.baeldung.custom")
@PropertySource("classpath:application-defaults.properties")
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/config/MethodSecurityConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/config/MethodSecurityConfig.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/config/MethodSecurityConfig.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/config/MethodSecurityConfig.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/config/MvcConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/config/MvcConfig.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/config/MvcConfig.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/config/MvcConfig.java
diff --git a/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/config/SecurityConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/config/SecurityConfig.java
new file mode 100644
index 0000000000..06357650dc
--- /dev/null
+++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/config/SecurityConfig.java
@@ -0,0 +1,31 @@
+package org.baeldung.custom.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+
+@Configuration
+@EnableWebSecurity
+public class SecurityConfig extends WebSecurityConfigurerAdapter {
+
+ @Override
+ protected void configure(final HttpSecurity http) throws Exception {
+ http.csrf()
+ .disable()
+ .authorizeRequests()
+ .anyRequest()
+ .authenticated()
+ .and()
+ .formLogin()
+ .permitAll();
+ }
+
+ @Bean
+ public PasswordEncoder encoder() {
+ return new BCryptPasswordEncoder(11);
+ }
+}
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/persistence/SetupData.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/SetupData.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/persistence/SetupData.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/SetupData.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/persistence/dao/OrganizationRepository.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/dao/OrganizationRepository.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/persistence/dao/OrganizationRepository.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/dao/OrganizationRepository.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/persistence/dao/PrivilegeRepository.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/dao/PrivilegeRepository.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/persistence/dao/PrivilegeRepository.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/dao/PrivilegeRepository.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/persistence/dao/UserRepository.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/dao/UserRepository.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/persistence/dao/UserRepository.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/dao/UserRepository.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/persistence/model/Foo.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/model/Foo.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/persistence/model/Foo.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/model/Foo.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/persistence/model/Organization.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/model/Organization.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/persistence/model/Organization.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/model/Organization.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/persistence/model/Privilege.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/model/Privilege.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/persistence/model/Privilege.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/model/Privilege.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/persistence/model/User.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/model/User.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/persistence/model/User.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/persistence/model/User.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/security/CustomMethodSecurityExpressionHandler.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/CustomMethodSecurityExpressionHandler.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/security/CustomMethodSecurityExpressionHandler.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/CustomMethodSecurityExpressionHandler.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/security/CustomMethodSecurityExpressionRoot.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/CustomMethodSecurityExpressionRoot.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/security/CustomMethodSecurityExpressionRoot.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/CustomMethodSecurityExpressionRoot.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/security/CustomPermissionEvaluator.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/CustomPermissionEvaluator.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/security/CustomPermissionEvaluator.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/CustomPermissionEvaluator.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/security/MySecurityExpressionRoot.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/MySecurityExpressionRoot.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/security/MySecurityExpressionRoot.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/MySecurityExpressionRoot.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/security/MyUserDetailsService.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/MyUserDetailsService.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/security/MyUserDetailsService.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/MyUserDetailsService.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/security/MyUserPrincipal.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/MyUserPrincipal.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/security/MyUserPrincipal.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/security/MyUserPrincipal.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/web/MainController.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/web/MainController.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/web/MainController.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/custom/web/MainController.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/ip/IpApplication.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/IpApplication.java
similarity index 85%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/ip/IpApplication.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/IpApplication.java
index b68abbaed1..d77414c54e 100644
--- a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/ip/IpApplication.java
+++ b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/IpApplication.java
@@ -3,9 +3,11 @@ package org.baeldung.ip;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.PropertySource;
@SpringBootApplication
+@ComponentScan("org.baeldung.ip")
@PropertySource("classpath:application-defaults.properties")
public class IpApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/ip/config/CustomIpAuthenticationProvider.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/config/CustomIpAuthenticationProvider.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/ip/config/CustomIpAuthenticationProvider.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/config/CustomIpAuthenticationProvider.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/ip/config/SecurityConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/config/SecurityConfig.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/ip/config/SecurityConfig.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/config/SecurityConfig.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/ip/config/SecurityXmlConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/config/SecurityXmlConfig.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/ip/config/SecurityXmlConfig.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/config/SecurityXmlConfig.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/ip/web/MainController.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/web/MainController.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/ip/web/MainController.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/ip/web/MainController.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/CustomAuthenticationProvider.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/CustomAuthenticationProvider.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/CustomAuthenticationProvider.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/CustomAuthenticationProvider.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/MyLogoutSuccessHandler.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/MyLogoutSuccessHandler.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/MyLogoutSuccessHandler.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/MyLogoutSuccessHandler.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/MyUserDetailsService.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/MyUserDetailsService.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/MyUserDetailsService.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/MyUserDetailsService.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/RolesAuthoritiesApplication.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/RolesAuthoritiesApplication.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/RolesAuthoritiesApplication.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/RolesAuthoritiesApplication.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/config/MvcConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/config/MvcConfig.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/config/MvcConfig.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/config/MvcConfig.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/config/SecurityConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/config/SecurityConfig.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/config/SecurityConfig.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/config/SecurityConfig.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/model/Privilege.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/model/Privilege.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/model/Privilege.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/model/Privilege.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/model/Role.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/model/Role.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/model/Role.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/model/Role.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/model/User.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/model/User.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/model/User.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/model/User.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/persistence/IUserService.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/IUserService.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/persistence/IUserService.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/IUserService.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/persistence/PrivilegeRepository.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/PrivilegeRepository.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/persistence/PrivilegeRepository.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/PrivilegeRepository.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/persistence/RoleRepository.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/RoleRepository.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/persistence/RoleRepository.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/RoleRepository.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/persistence/SetupDataLoader.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/SetupDataLoader.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/persistence/SetupDataLoader.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/SetupDataLoader.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/persistence/UserRepository.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/UserRepository.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/persistence/UserRepository.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/UserRepository.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/persistence/UserService.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/UserService.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/rolesauthorities/persistence/UserService.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/rolesauthorities/persistence/UserService.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/voter/MinuteBasedVoter.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/voter/MinuteBasedVoter.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/voter/MinuteBasedVoter.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/voter/MinuteBasedVoter.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/voter/VoterApplication.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/voter/VoterApplication.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/voter/VoterApplication.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/voter/VoterApplication.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/voter/VoterMvcConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/voter/VoterMvcConfig.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/voter/VoterMvcConfig.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/voter/VoterMvcConfig.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/voter/WebSecurityConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/voter/WebSecurityConfig.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/voter/WebSecurityConfig.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/voter/WebSecurityConfig.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/voter/XmlSecurityConfig.java b/spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/voter/XmlSecurityConfig.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/voter/XmlSecurityConfig.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/java/org/baeldung/voter/XmlSecurityConfig.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/application-defaults.properties b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/application-defaults.properties
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/application-defaults.properties
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/resources/application-defaults.properties
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/application.properties b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/application.properties
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/application.properties
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/resources/application.properties
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/logback.xml b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/logback.xml
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/logback.xml
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/resources/logback.xml
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/persistence-h2.properties b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/persistence-h2.properties
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/persistence-h2.properties
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/resources/persistence-h2.properties
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/spring-security-custom-voter.xml b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/spring-security-custom-voter.xml
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/spring-security-custom-voter.xml
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/resources/spring-security-custom-voter.xml
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/spring-security-ip.xml b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/spring-security-ip.xml
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/spring-security-ip.xml
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/resources/spring-security-ip.xml
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/403.html b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/403.html
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/403.html
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/403.html
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/index.html b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/index.html
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/index.html
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/index.html
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/login.html b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/login.html
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/login.html
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/login.html
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/loginAdmin.html b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/loginAdmin.html
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/loginAdmin.html
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/loginAdmin.html
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/loginUser.html b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/loginUser.html
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/loginUser.html
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/loginUser.html
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/login.html b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/multipleHttpElems/login.html
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/login.html
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/multipleHttpElems/login.html
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/loginWithWarning.html b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/multipleHttpElems/loginWithWarning.html
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/loginWithWarning.html
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/multipleHttpElems/loginWithWarning.html
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/multipleHttpLinks.html b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/multipleHttpElems/multipleHttpLinks.html
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/multipleHttpLinks.html
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/multipleHttpElems/multipleHttpLinks.html
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/myAdminPage.html b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/multipleHttpElems/myAdminPage.html
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/myAdminPage.html
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/multipleHttpElems/myAdminPage.html
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/myGuestPage.html b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/multipleHttpElems/myGuestPage.html
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/myGuestPage.html
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/multipleHttpElems/myGuestPage.html
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/myPrivateUserPage.html b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/multipleHttpElems/myPrivateUserPage.html
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/myPrivateUserPage.html
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/multipleHttpElems/myPrivateUserPage.html
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/myUserPage.html b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/multipleHttpElems/myUserPage.html
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/multipleHttpElems/myUserPage.html
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/multipleHttpElems/myUserPage.html
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/private.html b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/private.html
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/private.html
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/private.html
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/rolesauthorities/home.html b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/rolesauthorities/home.html
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/rolesauthorities/home.html
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/rolesauthorities/home.html
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/rolesauthorities/login.html b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/rolesauthorities/login.html
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/rolesauthorities/login.html
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/rolesauthorities/login.html
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/rolesauthorities/protectedbyauthority.html b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/rolesauthorities/protectedbyauthority.html
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/rolesauthorities/protectedbyauthority.html
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/rolesauthorities/protectedbyauthority.html
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/rolesauthorities/protectedbynothing.html b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/rolesauthorities/protectedbynothing.html
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/rolesauthorities/protectedbynothing.html
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/rolesauthorities/protectedbynothing.html
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/rolesauthorities/protectedbyrole.html b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/rolesauthorities/protectedbyrole.html
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/rolesauthorities/protectedbyrole.html
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/rolesauthorities/protectedbyrole.html
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/ssl/welcome.html b/spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/ssl/welcome.html
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/ssl/welcome.html
rename to spring-security-modules/spring-security-mvc-boot-1/src/main/resources/templates/ssl/welcome.html
diff --git a/spring-security-modules/spring-security-mvc-boot/src/test/java/com/baeldung/relationships/SpringDataWithSecurityIntegrationTest.java b/spring-security-modules/spring-security-mvc-boot-1/src/test/java/com/baeldung/relationships/SpringDataWithSecurityIntegrationTest.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/test/java/com/baeldung/relationships/SpringDataWithSecurityIntegrationTest.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/test/java/com/baeldung/relationships/SpringDataWithSecurityIntegrationTest.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/SpringContextTest.java b/spring-security-modules/spring-security-mvc-boot-1/src/test/java/org/baeldung/SpringContextTest.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/SpringContextTest.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/test/java/org/baeldung/SpringContextTest.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/web/ApplicationLiveTest.java b/spring-security-modules/spring-security-mvc-boot-1/src/test/java/org/baeldung/web/ApplicationLiveTest.java
similarity index 96%
rename from spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/web/ApplicationLiveTest.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/test/java/org/baeldung/web/ApplicationLiveTest.java
index dfcfcad609..e199411e58 100644
--- a/spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/web/ApplicationLiveTest.java
+++ b/spring-security-modules/spring-security-mvc-boot-1/src/test/java/org/baeldung/web/ApplicationLiveTest.java
@@ -13,7 +13,7 @@ import io.restassured.specification.RequestSpecification;
import org.junit.Test;
import org.springframework.http.MediaType;
-
+// In order to execute these tests, org.baeldung.custom.Application needs to be running.
public class ApplicationLiveTest {
@Test
diff --git a/spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java b/spring-security-modules/spring-security-mvc-boot-1/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java
similarity index 98%
rename from spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java
index d16acc729a..a69b52c0dd 100644
--- a/spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java
+++ b/spring-security-modules/spring-security-mvc-boot-1/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java
@@ -59,7 +59,7 @@ public class CustomUserDetailsServiceIntegrationTest {
@WithAnonymousUser
public void givenAnonymous_whenRequestFoo_thenRetrieveUnauthorized() throws Exception {
this.mvc.perform(get("/foos/1").with(csrf()))
- .andExpect(status().isUnauthorized());
+ .andExpect(status().isFound());
}
@Test
diff --git a/spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/web/IpLiveTest.java b/spring-security-modules/spring-security-mvc-boot-1/src/test/java/org/baeldung/web/IpLiveTest.java
similarity index 90%
rename from spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/web/IpLiveTest.java
rename to spring-security-modules/spring-security-mvc-boot-1/src/test/java/org/baeldung/web/IpLiveTest.java
index e12e2f87b0..761f5450f7 100644
--- a/spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/web/IpLiveTest.java
+++ b/spring-security-modules/spring-security-mvc-boot-1/src/test/java/org/baeldung/web/IpLiveTest.java
@@ -8,6 +8,7 @@ import io.restassured.response.Response;
import org.junit.Test;
+// In order to execute these tests, org.baeldung.ip.IpApplication needs to be running.
public class IpLiveTest {
@Test
diff --git a/spring-security-modules/spring-security-mvc-boot-2/README.md b/spring-security-modules/spring-security-mvc-boot-2/README.md
new file mode 100644
index 0000000000..3c95086d21
--- /dev/null
+++ b/spring-security-modules/spring-security-mvc-boot-2/README.md
@@ -0,0 +1,13 @@
+## Spring Boot Security MVC
+
+This module contains articles about Spring Security with Spring MVC in Boot applications
+
+### The Course
+The "REST With Spring" Classes: http://github.learnspringsecurity.com
+
+### Relevant Articles:
+- [Multiple Entry Points in Spring Security](https://www.baeldung.com/spring-security-multiple-entry-points)
+- [Multiple Authentication Providers in Spring Security](https://www.baeldung.com/spring-security-multiple-auth-providers)
+- [Two Login Pages with Spring Security](https://www.baeldung.com/spring-security-two-login-pages)
+- [HTTPS using Self-Signed Certificate in Spring Boot](https://www.baeldung.com/spring-boot-https-self-signed-certificate)
+- [Spring Security: Exploring JDBC Authentication](https://www.baeldung.com/spring-security-jdbc-authentication)
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-mvc-boot-2/WebContent/META-INF/MANIFEST.MF b/spring-security-modules/spring-security-mvc-boot-2/WebContent/META-INF/MANIFEST.MF
new file mode 100644
index 0000000000..254272e1c0
--- /dev/null
+++ b/spring-security-modules/spring-security-mvc-boot-2/WebContent/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Class-Path:
+
diff --git a/spring-security-modules/spring-security-mvc-boot/pom.xml b/spring-security-modules/spring-security-mvc-boot-2/pom.xml
similarity index 94%
rename from spring-security-modules/spring-security-mvc-boot/pom.xml
rename to spring-security-modules/spring-security-mvc-boot-2/pom.xml
index 489ec2d427..565528e070 100644
--- a/spring-security-modules/spring-security-mvc-boot/pom.xml
+++ b/spring-security-modules/spring-security-mvc-boot-2/pom.xml
@@ -3,11 +3,11 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- spring-security-mvc-boot
+ spring-security-mvc-boot-20.0.1-SNAPSHOT
- spring-security-mvc-boot
+ spring-security-mvc-boot-2war
- Spring Security MVC Boot
+ Spring Security MVC Boot - 2com.baeldung
@@ -61,12 +61,7 @@
org.hamcrest
- hamcrest-core
- test
-
-
- org.hamcrest
- hamcrest-library
+ hamcresttest
@@ -228,9 +223,6 @@
org.baeldung.custom.Application
-
-
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/h2/H2JdbcAuthenticationApplication.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/h2/H2JdbcAuthenticationApplication.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/h2/H2JdbcAuthenticationApplication.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/h2/H2JdbcAuthenticationApplication.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/h2/config/SecurityConfiguration.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/h2/config/SecurityConfiguration.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/h2/config/SecurityConfiguration.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/h2/config/SecurityConfiguration.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/h2/web/UserController.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/h2/web/UserController.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/h2/web/UserController.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/h2/web/UserController.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/mysql/MySqlJdbcAuthenticationApplication.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/mysql/MySqlJdbcAuthenticationApplication.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/mysql/MySqlJdbcAuthenticationApplication.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/mysql/MySqlJdbcAuthenticationApplication.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/mysql/config/SecurityConfiguration.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/mysql/config/SecurityConfiguration.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/mysql/config/SecurityConfiguration.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/mysql/config/SecurityConfiguration.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/mysql/web/UserController.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/mysql/web/UserController.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/mysql/web/UserController.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/mysql/web/UserController.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/postgre/PostgreJdbcAuthenticationApplication.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/postgre/PostgreJdbcAuthenticationApplication.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/postgre/PostgreJdbcAuthenticationApplication.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/postgre/PostgreJdbcAuthenticationApplication.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/postgre/config/SecurityConfiguration.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/postgre/config/SecurityConfiguration.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/postgre/config/SecurityConfiguration.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/postgre/config/SecurityConfiguration.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/postgre/web/UserController.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/postgre/web/UserController.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/postgre/web/UserController.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/jdbcauthentication/postgre/web/UserController.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/multipleauthproviders/CustomAuthenticationProvider.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleauthproviders/CustomAuthenticationProvider.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/multipleauthproviders/CustomAuthenticationProvider.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleauthproviders/CustomAuthenticationProvider.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/multipleauthproviders/MultipleAuthController.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleauthproviders/MultipleAuthController.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/multipleauthproviders/MultipleAuthController.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleauthproviders/MultipleAuthController.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/multipleauthproviders/MultipleAuthProvidersApplication.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleauthproviders/MultipleAuthProvidersApplication.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/multipleauthproviders/MultipleAuthProvidersApplication.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleauthproviders/MultipleAuthProvidersApplication.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/multipleauthproviders/MultipleAuthProvidersSecurityConfig.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleauthproviders/MultipleAuthProvidersSecurityConfig.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/multipleauthproviders/MultipleAuthProvidersSecurityConfig.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleauthproviders/MultipleAuthProvidersSecurityConfig.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsApplication.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsApplication.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsApplication.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsApplication.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsSecurityConfig.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsSecurityConfig.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsSecurityConfig.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleentrypoints/MultipleEntryPointsSecurityConfig.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/PagesController.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleentrypoints/PagesController.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/multipleentrypoints/PagesController.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multipleentrypoints/PagesController.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multiplelogin/MultipleLoginApplication.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginMvcConfig.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multiplelogin/MultipleLoginMvcConfig.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginMvcConfig.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multiplelogin/MultipleLoginMvcConfig.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginSecurityConfig.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multiplelogin/MultipleLoginSecurityConfig.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/MultipleLoginSecurityConfig.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multiplelogin/MultipleLoginSecurityConfig.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/UsersController.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multiplelogin/UsersController.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/multiplelogin/UsersController.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/multiplelogin/UsersController.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/ssl/HttpsEnabledApplication.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/ssl/HttpsEnabledApplication.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/ssl/HttpsEnabledApplication.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/ssl/HttpsEnabledApplication.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/ssl/SecurityConfig.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/ssl/SecurityConfig.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/ssl/SecurityConfig.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/ssl/SecurityConfig.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/ssl/WelcomeController.java b/spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/ssl/WelcomeController.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/ssl/WelcomeController.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/java/org/baeldung/ssl/WelcomeController.java
diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/application-defaults.properties b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/application-defaults.properties
new file mode 100644
index 0000000000..e2032c4a6b
--- /dev/null
+++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/application-defaults.properties
@@ -0,0 +1,13 @@
+spring.datasource.driver-class-name=org.h2.Driver
+spring.datasource.url=jdbc:h2:mem:security_permission;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
+spring.datasource.username=sa
+spring.datasource.password=
+spring.jpa.hibernate.ddl-auto=create-drop
+spring.jpa.database=H2
+spring.jpa.show-sql=false
+spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
+
+#logging.level.org.springframework.security.web.FilterChainProxy=DEBUG
+
+spring.h2.console.enabled=true
+spring.h2.console.path=/h2-console
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/application-mysql.properties b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/application-mysql.properties
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/application-mysql.properties
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/resources/application-mysql.properties
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/application-postgre.properties b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/application-postgre.properties
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/application-postgre.properties
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/resources/application-postgre.properties
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/application-ssl.properties b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/application-ssl.properties
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/application-ssl.properties
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/resources/application-ssl.properties
diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/application.properties b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/application.properties
new file mode 100644
index 0000000000..3cf12afeb9
--- /dev/null
+++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/application.properties
@@ -0,0 +1 @@
+server.port=8082
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/data-mysql.sql b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/data-mysql.sql
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/data-mysql.sql
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/resources/data-mysql.sql
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/data-postgre.sql b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/data-postgre.sql
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/data-postgre.sql
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/resources/data-postgre.sql
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/keystore/baeldung.p12 b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/keystore/baeldung.p12
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/keystore/baeldung.p12
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/resources/keystore/baeldung.p12
diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/logback.xml b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/persistence-h2.properties b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/persistence-h2.properties
new file mode 100644
index 0000000000..a4b2af6361
--- /dev/null
+++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/persistence-h2.properties
@@ -0,0 +1,8 @@
+driverClassName=org.h2.Driver
+url=jdbc:h2:mem:myDb;DB_CLOSE_DELAY=-1
+username=sa
+password=
+
+hibernate.dialect=org.hibernate.dialect.H2Dialect
+hibernate.show_sql=false
+hibernate.hbm2ddl.auto=create-drop
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/schema-mysql.sql b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/schema-mysql.sql
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/schema-mysql.sql
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/resources/schema-mysql.sql
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/schema-postgre.sql b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/schema-postgre.sql
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/schema-postgre.sql
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/resources/schema-postgre.sql
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/spring-security-multiple-auth-providers.xml b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/spring-security-multiple-auth-providers.xml
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/spring-security-multiple-auth-providers.xml
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/resources/spring-security-multiple-auth-providers.xml
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/spring-security-multiple-entry.xml b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/spring-security-multiple-entry.xml
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/spring-security-multiple-entry.xml
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/resources/spring-security-multiple-entry.xml
diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/403.html b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/403.html
new file mode 100644
index 0000000000..20550768cf
--- /dev/null
+++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/403.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+You do not have permission to view this page.
+
+
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/adminPage.html b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/adminPage.html
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/adminPage.html
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/adminPage.html
diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/index.html b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/index.html
new file mode 100644
index 0000000000..8e7394ad6a
--- /dev/null
+++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/index.html
@@ -0,0 +1,21 @@
+
+
+
+
+Spring Security Thymeleaf
+
+
+
+
+
+
+ Welcome
+
+
+
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/login.html b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/login.html
new file mode 100644
index 0000000000..dd6bd04767
--- /dev/null
+++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/login.html
@@ -0,0 +1,27 @@
+
+
+
+
+
Login
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/loginAdmin.html b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/loginAdmin.html
new file mode 100644
index 0000000000..43d0e73233
--- /dev/null
+++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/loginAdmin.html
@@ -0,0 +1,31 @@
+
+
+
+
+Insert title here
+
+
+
+
Admin login page
+
+
+
Login failed!
+
+
+
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/loginUser.html b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/loginUser.html
new file mode 100644
index 0000000000..bf4ddd48bc
--- /dev/null
+++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/loginUser.html
@@ -0,0 +1,30 @@
+
+
+
+
+Login
+
+
+
+
User login page
+
+
+
Login failed!
+
+
+
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/multipleHttpElems/login.html b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/multipleHttpElems/login.html
new file mode 100644
index 0000000000..2119baec66
--- /dev/null
+++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/multipleHttpElems/login.html
@@ -0,0 +1,27 @@
+
+
+
+
+
Login
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/multipleHttpElems/loginWithWarning.html b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/multipleHttpElems/loginWithWarning.html
new file mode 100644
index 0000000000..a5b2eaf3dc
--- /dev/null
+++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/multipleHttpElems/loginWithWarning.html
@@ -0,0 +1,28 @@
+
+
+
+
+
Login
+
Warning! You are about to access sensible data!
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/multipleHttpElems/multipleHttpLinks.html b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/multipleHttpElems/multipleHttpLinks.html
new file mode 100644
index 0000000000..676badb16f
--- /dev/null
+++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/multipleHttpElems/multipleHttpLinks.html
@@ -0,0 +1,18 @@
+
+
+
+
+Multiple Http Elements Links
+
+
+
+Admin page
+
+User page
+
+Private user page
+
+Guest page
+
+
+
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/multipleHttpElems/myAdminPage.html b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/multipleHttpElems/myAdminPage.html
new file mode 100644
index 0000000000..3003833562
--- /dev/null
+++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/multipleHttpElems/myAdminPage.html
@@ -0,0 +1,13 @@
+
+
+
+
+Admin Page
+
+
+Welcome admin!
+
+
+Back to links
+
+
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/multipleHttpElems/myGuestPage.html b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/multipleHttpElems/myGuestPage.html
new file mode 100644
index 0000000000..47a4c9c44a
--- /dev/null
+++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/multipleHttpElems/myGuestPage.html
@@ -0,0 +1,13 @@
+
+
+
+
+Guest Page
+
+
+Welcome guest!
+
+
+Back to links
+
+
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/multipleHttpElems/myPrivateUserPage.html b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/multipleHttpElems/myPrivateUserPage.html
new file mode 100644
index 0000000000..52045ec320
--- /dev/null
+++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/multipleHttpElems/myPrivateUserPage.html
@@ -0,0 +1,13 @@
+
+
+
+
+Insert title here
+
+
+Welcome user to your private page! Logout
+
+
+Back to links
+
+
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/multipleHttpElems/myUserPage.html b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/multipleHttpElems/myUserPage.html
new file mode 100644
index 0000000000..f6c2def0b8
--- /dev/null
+++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/multipleHttpElems/myUserPage.html
@@ -0,0 +1,13 @@
+
+
+
+
+User Page
+
+
+Welcome user! Logout
+
+
+Back to links
+
+
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/private.html b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/private.html
new file mode 100644
index 0000000000..035d84bbbd
--- /dev/null
+++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/private.html
@@ -0,0 +1,10 @@
+
+
+
+ Private
+
+
+
Congrats!
+
+
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/protectedLinks.html b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/protectedLinks.html
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/protectedLinks.html
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/protectedLinks.html
diff --git a/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/ssl/welcome.html b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/ssl/welcome.html
new file mode 100644
index 0000000000..93b3577f5c
--- /dev/null
+++ b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/ssl/welcome.html
@@ -0,0 +1 @@
+
Welcome to Secured Site
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/userPage.html b/spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/userPage.html
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/main/resources/templates/userPage.html
rename to spring-security-modules/spring-security-mvc-boot-2/src/main/resources/templates/userPage.html
diff --git a/spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/jdbcauthentication/h2/SpringContextTest.java b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/jdbcauthentication/h2/SpringContextTest.java
similarity index 85%
rename from spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/jdbcauthentication/h2/SpringContextTest.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/jdbcauthentication/h2/SpringContextTest.java
index 7aa26ff031..659dad9155 100644
--- a/spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/jdbcauthentication/h2/SpringContextTest.java
+++ b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/jdbcauthentication/h2/SpringContextTest.java
@@ -1,5 +1,6 @@
package org.baeldung.jdbcauthentication.h2;
+import org.baeldung.jdbcauthentication.h2.H2JdbcAuthenticationApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
diff --git a/spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/jdbcauthentication/h2/web/UserControllerLiveTest.java b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/jdbcauthentication/h2/web/UserControllerLiveTest.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/jdbcauthentication/h2/web/UserControllerLiveTest.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/jdbcauthentication/h2/web/UserControllerLiveTest.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/jdbcauthentication/mysql/web/UserControllerLiveTest.java b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/jdbcauthentication/mysql/web/UserControllerLiveTest.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/jdbcauthentication/mysql/web/UserControllerLiveTest.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/jdbcauthentication/mysql/web/UserControllerLiveTest.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/jdbcauthentication/postgre/web/UserControllerLiveTest.java b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/jdbcauthentication/postgre/web/UserControllerLiveTest.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/jdbcauthentication/postgre/web/UserControllerLiveTest.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/jdbcauthentication/postgre/web/UserControllerLiveTest.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/web/HttpsApplicationIntegrationTest.java b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/web/HttpsApplicationIntegrationTest.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/web/HttpsApplicationIntegrationTest.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/web/HttpsApplicationIntegrationTest.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/web/MultipleAuthProvidersApplicationIntegrationTest.java b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/web/MultipleAuthProvidersApplicationIntegrationTest.java
similarity index 100%
rename from spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/web/MultipleAuthProvidersApplicationIntegrationTest.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/web/MultipleAuthProvidersApplicationIntegrationTest.java
diff --git a/spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/web/MultipleEntryPointsIntegrationTest.java b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/web/MultipleEntryPointsIntegrationTest.java
similarity index 99%
rename from spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/web/MultipleEntryPointsIntegrationTest.java
rename to spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/web/MultipleEntryPointsIntegrationTest.java
index 157480c3f1..422be2ac88 100644
--- a/spring-security-modules/spring-security-mvc-boot/src/test/java/org/baeldung/web/MultipleEntryPointsIntegrationTest.java
+++ b/spring-security-modules/spring-security-mvc-boot-2/src/test/java/org/baeldung/web/MultipleEntryPointsIntegrationTest.java
@@ -1,6 +1,5 @@
package org.baeldung.web;
-import org.baeldung.multipleentrypoints.MultipleEntryPointsApplication;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -15,6 +14,9 @@ import org.springframework.web.context.WebApplicationContext;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+import org.baeldung.multipleentrypoints.MultipleEntryPointsApplication;
+
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*;
@RunWith(SpringRunner.class)
diff --git a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/config/SecurityConfig.java b/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/config/SecurityConfig.java
deleted file mode 100644
index 739e4d3417..0000000000
--- a/spring-security-modules/spring-security-mvc-boot/src/main/java/org/baeldung/custom/config/SecurityConfig.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.baeldung.custom.config;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
-import org.springframework.security.crypto.password.PasswordEncoder;
-
-@Configuration
-public class SecurityConfig {
-
- @Bean
- public PasswordEncoder encoder() {
- return new BCryptPasswordEncoder(11);
- }
-}
\ No newline at end of file
diff --git a/spring-security-modules/spring-security-rest-custom/pom.xml b/spring-security-modules/spring-security-rest-custom/pom.xml
index d9072ec8a2..b4f0f93bb6 100644
--- a/spring-security-modules/spring-security-rest-custom/pom.xml
+++ b/spring-security-modules/spring-security-rest-custom/pom.xml
@@ -136,12 +136,7 @@
org.hamcrest
- hamcrest-core
- test
-
-
- org.hamcrest
- hamcrest-library
+ hamcresttest
diff --git a/spring-security-modules/spring-security-rest/README.md b/spring-security-modules/spring-security-rest/README.md
index 00bc2a1403..f7e91b85dc 100644
--- a/spring-security-modules/spring-security-rest/README.md
+++ b/spring-security-modules/spring-security-rest/README.md
@@ -16,3 +16,4 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com
- [Intro to Spring Security Expressions](https://www.baeldung.com/spring-security-expressions)
- [Spring Security for a REST API](https://www.baeldung.com/securing-a-restful-web-service-with-spring-security)
- [Spring Security Expressions - hasRole Example](https://www.baeldung.com/spring-security-expressions-basic)
+- [Error Handling for REST with Spring](https://www.baeldung.com/exception-handling-for-rest-with-spring)
diff --git a/spring-threads/pom.xml b/spring-threads/pom.xml
new file mode 100644
index 0000000000..4513c627b9
--- /dev/null
+++ b/spring-threads/pom.xml
@@ -0,0 +1,25 @@
+
+
+ 4.0.0
+ spring-threads
+ 0.0.1-SNAPSHOT
+ spring-threads
+ jar
+
+
+ com.baeldung
+ parent-spring-5
+ 0.0.1-SNAPSHOT
+ ../parent-spring-5
+
+
+
+
+ org.springframework
+ spring-context
+ ${spring.version}
+
+
+
+
diff --git a/spring-threads/src/test/java/com/baeldung/threading/ThreadPoolTaskExecutorUnitTest.java b/spring-threads/src/test/java/com/baeldung/threading/ThreadPoolTaskExecutorUnitTest.java
new file mode 100644
index 0000000000..0d927ebe69
--- /dev/null
+++ b/spring-threads/src/test/java/com/baeldung/threading/ThreadPoolTaskExecutorUnitTest.java
@@ -0,0 +1,98 @@
+package com.baeldung.threading;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ThreadLocalRandom;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+public class ThreadPoolTaskExecutorUnitTest {
+
+ void startThreads(ThreadPoolTaskExecutor taskExecutor, CountDownLatch countDownLatch, int numThreads) {
+ for (int i = 0; i < numThreads; i++) {
+ taskExecutor.execute(() -> {
+ try {
+ Thread.sleep(100L * ThreadLocalRandom.current().nextLong(1, 10));
+ countDownLatch.countDown();
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ });
+ }
+ }
+
+ @Test
+ public void whenUsingDefaults_thenSingleThread() {
+ ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
+ taskExecutor.afterPropertiesSet();
+
+ CountDownLatch countDownLatch = new CountDownLatch(10);
+ this.startThreads(taskExecutor, countDownLatch, 10);
+
+ while (countDownLatch.getCount() > 0) {
+ Assert.assertEquals(1, taskExecutor.getPoolSize());
+ }
+ }
+
+ @Test
+ public void whenCorePoolSizeFive_thenFiveThreads() {
+ ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
+ taskExecutor.setCorePoolSize(5);
+ taskExecutor.afterPropertiesSet();
+
+ CountDownLatch countDownLatch = new CountDownLatch(10);
+ this.startThreads(taskExecutor, countDownLatch, 10);
+
+ while (countDownLatch.getCount() > 0) {
+ Assert.assertEquals(5, taskExecutor.getPoolSize());
+ }
+ }
+
+ @Test
+ public void whenCorePoolSizeFiveAndMaxPoolSizeTen_thenFiveThreads() {
+ ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
+ taskExecutor.setCorePoolSize(5);
+ taskExecutor.setMaxPoolSize(10);
+ taskExecutor.afterPropertiesSet();
+
+ CountDownLatch countDownLatch = new CountDownLatch(10);
+ this.startThreads(taskExecutor, countDownLatch, 10);
+
+ while (countDownLatch.getCount() > 0) {
+ Assert.assertEquals(5, taskExecutor.getPoolSize());
+ }
+ }
+
+ @Test
+ public void whenCorePoolSizeFiveAndMaxPoolSizeTenAndQueueCapacityZero_thenTenThreads() {
+ ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
+ taskExecutor.setCorePoolSize(5);
+ taskExecutor.setMaxPoolSize(10);
+ taskExecutor.setQueueCapacity(0);
+ taskExecutor.afterPropertiesSet();
+
+ CountDownLatch countDownLatch = new CountDownLatch(10);
+ this.startThreads(taskExecutor, countDownLatch, 10);
+
+ while (countDownLatch.getCount() > 0) {
+ Assert.assertEquals(10, taskExecutor.getPoolSize());
+ }
+ }
+
+ @Test
+ public void whenCorePoolSizeFiveAndMaxPoolSizeTenAndQueueCapacityTen_thenTenThreads() {
+ ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
+ taskExecutor.setCorePoolSize(5);
+ taskExecutor.setMaxPoolSize(10);
+ taskExecutor.setQueueCapacity(10);
+ taskExecutor.afterPropertiesSet();
+
+ CountDownLatch countDownLatch = new CountDownLatch(20);
+ this.startThreads(taskExecutor, countDownLatch, 20);
+
+ while (countDownLatch.getCount() > 0) {
+ Assert.assertEquals(10, taskExecutor.getPoolSize());
+ }
+ }
+}
diff --git a/testing-modules/hamcrest/pom.xml b/testing-modules/hamcrest/pom.xml
index cfd5bf5fac..ec9177d8f2 100644
--- a/testing-modules/hamcrest/pom.xml
+++ b/testing-modules/hamcrest/pom.xml
@@ -18,13 +18,13 @@
org.hamcrestjava-hamcrest
- ${hamcrest.version}
+ ${java-hamcrest.version}test
- 2.0.0.0
+ 2.0.0.0
diff --git a/testing-modules/junit5-annotations/pom.xml b/testing-modules/junit5-annotations/pom.xml
index 080844c30b..d0fba4d21b 100644
--- a/testing-modules/junit5-annotations/pom.xml
+++ b/testing-modules/junit5-annotations/pom.xml
@@ -49,8 +49,8 @@
- 5.4.2
- 1.4.2
+ 5.6.0
+ 1.6.02.8.2
diff --git a/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/conditional/ConditionalAnnotationsUnitTest.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/conditional/ConditionalAnnotationsUnitTest.java
index ddceb78cac..ba840a1c33 100644
--- a/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/conditional/ConditionalAnnotationsUnitTest.java
+++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/conditional/ConditionalAnnotationsUnitTest.java
@@ -10,6 +10,7 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
public class ConditionalAnnotationsUnitTest {
+
@Test
@EnabledOnOs({OS.WINDOWS, OS.MAC})
public void shouldRunBothWindowsAndMac() {
@@ -28,6 +29,18 @@ public class ConditionalAnnotationsUnitTest {
System.out.println("runs with java 10 and 11");
}
+ @Test
+ @EnabledForJreRange(min = JRE.JAVA_8, max = JRE.JAVA_13)
+ public void shouldOnlyRunOnJava8UntilJava13() {
+ System.out.println("runs with Java 8, 9, 10, 11, 12 and 13!");
+ }
+
+ @Test
+ @DisabledForJreRange(min = JRE.JAVA_14, max = JRE.JAVA_15)
+ public void shouldNotBeRunOnJava14AndJava15() {
+ System.out.println("Shouldn't be run on Java 14 and 15.");
+ }
+
@Test
@DisabledOnJre(JRE.OTHER)
public void thisTestOnlyRunsWithUpToDateJREs() {
@@ -58,36 +71,38 @@ public class ConditionalAnnotationsUnitTest {
System.out.println("will not run if environment variable LC_TIME is UTF-8");
}
+ // Commented codes are going to work prior JUnit 5.5
+
@Test
- @EnabledIf("'FR' == systemProperty.get('user.country')")
+ // @EnabledIf("'FR' == systemProperty.get('user.country')")
public void onlyFrenchPeopleWillRunThisMethod() {
System.out.println("will run only if user.country is FR");
}
@Test
- @DisabledIf("java.lang.System.getProperty('os.name').toLowerCase().contains('mac')")
+ // @DisabledIf("java.lang.System.getProperty('os.name').toLowerCase().contains('mac')")
public void shouldNotRunOnMacOS() {
System.out.println("will not run if our os.name is mac");
}
@Test
- @EnabledIf(value = {
- "load('nashorn:mozilla_compat.js')",
- "importPackage(java.time)",
- "",
- "var thisMonth = LocalDate.now().getMonth().name()",
- "var february = Month.FEBRUARY.name()",
- "thisMonth.equals(february)"
+ /*@EnabledIf(value = {
+ "load('nashorn:mozilla_compat.js')",
+ "importPackage(java.time)",
+ "",
+ "var thisMonth = LocalDate.now().getMonth().name()",
+ "var february = Month.FEBRUARY.name()",
+ "thisMonth.equals(february)"
},
- engine = "nashorn",
- reason = "Self-fulfilling: {result}")
+ engine = "nashorn",
+ reason = "Self-fulfilling: {result}")*/
public void onlyRunsInFebruary() {
System.out.println("this test only runs in February");
}
@Test
- @DisabledIf("systemEnvironment.get('XPC_SERVICE_NAME') != null " +
- "&& systemEnvironment.get('XPC_SERVICE_NAME').contains('intellij')")
+ /*@DisabledIf("systemEnvironment.get('XPC_SERVICE_NAME') != null " +
+ "&& systemEnvironment.get('XPC_SERVICE_NAME').contains('intellij')")*/
public void notValidForIntelliJ() {
System.out.println("this test will run if our ide is INTELLIJ");
}
@@ -107,7 +122,7 @@ public class ConditionalAnnotationsUnitTest {
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
- @DisabledIf("Math.random() >= 0.5")
+ // @DisabledIf("Math.random() >= 0.5")
@interface CoinToss {
}
diff --git a/testing-modules/mockito/pom.xml b/testing-modules/mockito/pom.xml
index 0fb11d23ab..aae3981c66 100644
--- a/testing-modules/mockito/pom.xml
+++ b/testing-modules/mockito/pom.xml
@@ -90,7 +90,6 @@
2.0.2
- 2.0.0.02.1.1
diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java
index dd41d98b57..9dd98f184b 100644
--- a/testing-modules/mockito/src/test/java/com/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java
+++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java
@@ -16,48 +16,51 @@ public class MockitoVoidMethodsUnitTest {
@Test
public void whenAddCalledVerified() {
- MyList mockVoid = mock(MyList.class);
- mockVoid.add(0, "");
- verify(mockVoid, times(1)).add(0, "");
+ MyList myList = mock(MyList.class);
+ myList.add(0, "");
+
+ verify(myList, times(1)).add(0, "");
}
@Test(expected = Exception.class)
public void givenNull_addThrows() {
- MyList mockVoid = mock(MyList.class);
- doThrow().when(mockVoid).add(isA(Integer.class), isNull());
- mockVoid.add(0, null);
+ MyList myList = mock(MyList.class);
+ doThrow().when(myList).add(isA(Integer.class), isNull());
+
+ myList.add(0, null);
}
@Test
public void whenAddCalledValueCaptured() {
- MyList mockVoid = mock(MyList.class);
+ MyList myList = mock(MyList.class);
ArgumentCaptor valueCapture = ArgumentCaptor.forClass(String.class);
- doNothing().when(mockVoid).add(any(Integer.class), valueCapture.capture());
- mockVoid.add(0, "captured");
+ doNothing().when(myList).add(any(Integer.class), valueCapture.capture());
+ myList.add(0, "captured");
+
assertEquals("captured", valueCapture.getValue());
}
@Test
public void whenAddCalledAnswered() {
- MyList mockVoid = mock(MyList.class);
- doAnswer((Answer) invocation -> {
+ MyList myList = mock(MyList.class);
+ doAnswer(invocation -> {
Object arg0 = invocation.getArgument(0);
Object arg1 = invocation.getArgument(1);
//do something with the arguments here
assertEquals(3, arg0);
assertEquals("answer me", arg1);
-
return null;
- }).when(mockVoid).add(any(Integer.class), any(String.class));
- mockVoid.add(3, "answer me");
+ }).when(myList).add(any(Integer.class), any(String.class));
+ myList.add(3, "answer me");
}
@Test
public void whenAddCalledRealMethodCalled() {
- MyList mockVoid = mock(MyList.class);
- doCallRealMethod().when(mockVoid).add(any(Integer.class), any(String.class));
- mockVoid.add(1, "real");
- verify(mockVoid, times(1)).add(1, "real");
+ MyList myList = mock(MyList.class);
+ doCallRealMethod().when(myList).add(any(Integer.class), any(String.class));
+ myList.add(1, "real");
+
+ verify(myList, times(1)).add(1, "real");
}
}
diff --git a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssured2IntegrationTest.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssured2IntegrationTest.java
index 805d67271d..c579f1c260 100644
--- a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssured2IntegrationTest.java
+++ b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssured2IntegrationTest.java
@@ -17,8 +17,7 @@ import static io.restassured.RestAssured.with;
import static org.hamcrest.Matchers.hasItems;
public class RestAssured2IntegrationTest {
- private static final int PORT = 8084;
- private static WireMockServer wireMockServer = new WireMockServer(PORT);
+ private static WireMockServer wireMockServer;
private static final String EVENTS_PATH = "/odds";
private static final String APPLICATION_JSON = "application/json";
@@ -27,9 +26,11 @@ public class RestAssured2IntegrationTest {
@BeforeClass
public static void before() throws Exception {
System.out.println("Setting up!");
+ final int port = Util.getAvailablePort();
+ wireMockServer = new WireMockServer(port);
wireMockServer.start();
- configureFor("localhost", PORT);
- RestAssured.port = PORT;
+ configureFor("localhost", port);
+ RestAssured.port = port;
stubFor(get(urlEqualTo(EVENTS_PATH)).willReturn(
aResponse().withStatus(200)
.withHeader("Content-Type", APPLICATION_JSON)
diff --git a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredIntegrationTest.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredIntegrationTest.java
index 4ad3cea22c..e4279897e2 100644
--- a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredIntegrationTest.java
+++ b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredIntegrationTest.java
@@ -21,8 +21,7 @@ import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.hasItems;
public class RestAssuredIntegrationTest {
- private static final int PORT = 8083;
- private static WireMockServer wireMockServer = new WireMockServer(PORT);
+ private static WireMockServer wireMockServer;
private static final String EVENTS_PATH = "/events?id=390";
private static final String APPLICATION_JSON = "application/json";
@@ -31,9 +30,11 @@ public class RestAssuredIntegrationTest {
@BeforeClass
public static void before() throws Exception {
System.out.println("Setting up!");
+ final int port = Util.getAvailablePort();
+ wireMockServer = new WireMockServer(port);
wireMockServer.start();
- RestAssured.port = PORT;
- configureFor("localhost", PORT);
+ RestAssured.port = port;
+ configureFor("localhost", port);
stubFor(get(urlEqualTo(EVENTS_PATH)).willReturn(
aResponse().withStatus(200)
.withHeader("Content-Type", APPLICATION_JSON)
diff --git a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXML2IntegrationTest.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXML2IntegrationTest.java
index 4a29d8832f..f71cce603c 100644
--- a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXML2IntegrationTest.java
+++ b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXML2IntegrationTest.java
@@ -12,11 +12,11 @@ import static com.github.tomakehurst.wiremock.client.WireMock.get;
import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
import static io.restassured.RestAssured.get;
+import static io.restassured.RestAssured.port;
import static org.hamcrest.Matchers.hasItems;
public class RestAssuredXML2IntegrationTest {
- private static final int PORT = 8082;
- private static WireMockServer wireMockServer = new WireMockServer(PORT);
+ private static WireMockServer wireMockServer;
private static final String EVENTS_PATH = "/teachers";
private static final String APPLICATION_XML = "application/xml";
@@ -25,9 +25,11 @@ public class RestAssuredXML2IntegrationTest {
@BeforeClass
public static void before() throws Exception {
System.out.println("Setting up!");
+ final int port = Util.getAvailablePort();
+ wireMockServer = new WireMockServer(port);
wireMockServer.start();
- RestAssured.port = PORT;
- configureFor("localhost", PORT);
+ RestAssured.port = port;
+ configureFor("localhost", port);
stubFor(get(urlEqualTo(EVENTS_PATH)).willReturn(
aResponse().withStatus(200)
.withHeader("Content-Type", APPLICATION_XML)
diff --git a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXMLIntegrationTest.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXMLIntegrationTest.java
index f1a22831f4..082dace526 100644
--- a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXMLIntegrationTest.java
+++ b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXMLIntegrationTest.java
@@ -17,8 +17,7 @@ import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.xml.HasXPath.hasXPath;
public class RestAssuredXMLIntegrationTest {
- private static final int PORT = 8081;
- private static WireMockServer wireMockServer = new WireMockServer(PORT);
+ private static WireMockServer wireMockServer;
private static final String EVENTS_PATH = "/employees";
private static final String APPLICATION_XML = "application/xml";
@@ -27,9 +26,11 @@ public class RestAssuredXMLIntegrationTest {
@BeforeClass
public static void before() throws Exception {
System.out.println("Setting up!");
+ final int port = Util.getAvailablePort();
+ wireMockServer = new WireMockServer(port);
wireMockServer.start();
- configureFor("localhost", PORT);
- RestAssured.port = PORT;
+ configureFor("localhost", port);
+ RestAssured.port = port;
stubFor(post(urlEqualTo(EVENTS_PATH)).willReturn(
aResponse().withStatus(200)
.withHeader("Content-Type", APPLICATION_XML)
diff --git a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/Util.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/Util.java
index 02dec87927..70c595f562 100644
--- a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/Util.java
+++ b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/Util.java
@@ -1,10 +1,15 @@
package com.baeldung.restassured;
+import java.io.IOException;
import java.io.InputStream;
+import java.net.ServerSocket;
+import java.util.Random;
import java.util.Scanner;
final class Util {
+ private static final int DEFAULT_PORT = 8069;
+
private Util() {
}
@@ -12,4 +17,22 @@ final class Util {
Scanner s = new Scanner(is).useDelimiter("\\A");
return s.hasNext() ? s.next() : "";
}
+
+ static int getAvailablePort() {
+ return new Random()
+ .ints(6000, 9000)
+ .filter(Util::isFree)
+ .findFirst()
+ .orElse(DEFAULT_PORT);
+ }
+
+
+ private static boolean isFree(int port) {
+ try {
+ new ServerSocket(port).close();
+ return true;
+ } catch (IOException e) {
+ return false;
+ }
+ }
}
diff --git a/testing-modules/selenium-junit-testng/pom.xml b/testing-modules/selenium-junit-testng/pom.xml
index 0616cdaa29..3734bf72c9 100644
--- a/testing-modules/selenium-junit-testng/pom.xml
+++ b/testing-modules/selenium-junit-testng/pom.xml
@@ -38,7 +38,7 @@
org.hamcresthamcrest-all
- ${org.hamcrest.version}
+ ${hamcrest-all.version}
@@ -71,4 +71,4 @@
3.4.0
-
\ No newline at end of file
+
diff --git a/testing-modules/spring-testing/pom.xml b/testing-modules/spring-testing/pom.xml
index 38e7a0dd46..c5e94f3afc 100644
--- a/testing-modules/spring-testing/pom.xml
+++ b/testing-modules/spring-testing/pom.xml
@@ -19,7 +19,7 @@
org.hamcrestjava-hamcrest
- ${hamcrest.version}
+ ${java-hamcrest.version}
@@ -114,7 +114,7 @@
- 2.0.0.0
+ 2.0.0.03.1.65.5.01.5.2
diff --git a/testing-modules/testing-libraries/README.md b/testing-modules/testing-libraries/README.md
index b5360bd841..b1e1575e63 100644
--- a/testing-modules/testing-libraries/README.md
+++ b/testing-modules/testing-libraries/README.md
@@ -5,7 +5,6 @@
- [Intro to JaCoCo](http://www.baeldung.com/jacoco)
- [Cucumber and Scenario Outline](http://www.baeldung.com/cucumber-scenario-outline)
- [Cucumber Java 8 Support](http://www.baeldung.com/cucumber-java-8-support)
-- [Introduction to Lambda Behave](http://www.baeldung.com/lambda-behave)
- [Introduction to CheckStyle](https://www.baeldung.com/checkstyle-java)
- [Introduction to FindBugs](https://www.baeldung.com/intro-to-findbugs)
- [Cucumber Data Tables](https://www.baeldung.com/cucumber-data-tables)