diff --git a/core-java-modules/core-java-9-jigsaw/src/test/java/com/baeldung/java9/modules/ModuleAPIUnitTest.java b/core-java-modules/core-java-9-jigsaw/src/test/java/com/baeldung/java9/modules/ModuleAPIUnitTest.java index f6ea266676..ed2dcaf695 100644 --- a/core-java-modules/core-java-9-jigsaw/src/test/java/com/baeldung/java9/modules/ModuleAPIUnitTest.java +++ b/core-java-modules/core-java-9-jigsaw/src/test/java/com/baeldung/java9/modules/ModuleAPIUnitTest.java @@ -2,12 +2,21 @@ package com.baeldung.java9.modules; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.nullValue; -import static org.hamcrest.Matchers.*; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.hasItems; import static org.hamcrest.collection.IsEmptyCollection.empty; -import static org.junit.Assert.*; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import java.lang.module.ModuleDescriptor; -import java.lang.module.ModuleDescriptor.*; + +import java.lang.module.ModuleDescriptor.Builder; +import java.lang.module.ModuleDescriptor.Exports; +import java.lang.module.ModuleDescriptor.Opens; +import java.lang.module.ModuleDescriptor.Provides; +import java.lang.module.ModuleDescriptor.Requires; import java.sql.Date; import java.sql.Driver; import java.util.HashMap; @@ -16,7 +25,7 @@ import java.util.stream.Collectors; import org.junit.Before; import org.junit.Test; -import org.junit.Ignore; + public class ModuleAPIUnitTest { @@ -28,14 +37,9 @@ public class ModuleAPIUnitTest { @Before public void setUp() { - Class hashMapClass = HashMap.class; - javaBaseModule = hashMapClass.getModule(); - - Class dateClass = Date.class; - javaSqlModule = dateClass.getModule(); - - Class personClass = Person.class; - module = personClass.getModule(); + javaBaseModule = HashMap.class.getModule(); + javaSqlModule = Date.class.getModule(); + module = Person.class.getModule(); } @Test @@ -111,7 +115,6 @@ public class ModuleAPIUnitTest { } @Test - @Ignore // fixing in http://team.baeldung.com/browse/JAVA-8679 public void givenModules_whenAccessingModuleDescriptorProvides_thenProvidesAreReturned() { Set javaBaseProvides = javaBaseModule.getDescriptor().provides(); Set javaSqlProvides = javaSqlModule.getDescriptor().provides(); @@ -120,7 +123,7 @@ public class ModuleAPIUnitTest { .map(Provides::service) .collect(Collectors.toSet()); - assertThat(javaBaseProvidesService, contains("java.nio.file.spi.FileSystemProvider")); + assertThat(javaBaseProvidesService, hasItem("java.nio.file.spi.FileSystemProvider")); assertThat(javaSqlProvides, empty()); } @@ -132,15 +135,14 @@ public class ModuleAPIUnitTest { .map(Exports::source) .collect(Collectors.toSet()); - assertThat(javaSqlExportsSource, hasItems("java.sql", "javax.sql")); + assertThat(javaSqlExportsSource, hasItems("java.sql", "javax.sql")); } @Test public void givenModules_whenAccessingModuleDescriptorUses_thenUsesAreReturned() { - Set javaBaseUses = javaBaseModule.getDescriptor().uses(); Set javaSqlUses = javaSqlModule.getDescriptor().uses(); - assertThat(javaSqlUses, contains("java.sql.Driver")); + assertThat(javaSqlUses, hasItem("java.sql.Driver")); } @Test diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/implicitsuperconstructorundefined/Employee.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/implicitsuperconstructorundefined/Employee.java new file mode 100644 index 0000000000..708e2f33f8 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/implicitsuperconstructorundefined/Employee.java @@ -0,0 +1,26 @@ +package com.baeldung.implicitsuperconstructorundefined; + +public class Employee extends Person { + + private Double salary; + + public Employee(String name, Integer age, Double salary) { + // comment this super call to see the error. + super(name, age); + this.salary = salary; + } + + public Employee(Double salary) { + super(); + this.salary = salary; + } + + public Double getSalary() { + return salary; + } + + public void setSalary(Double salary) { + this.salary = salary; + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/implicitsuperconstructorundefined/Person.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/implicitsuperconstructorundefined/Person.java new file mode 100644 index 0000000000..ff4cde5db7 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/implicitsuperconstructorundefined/Person.java @@ -0,0 +1,35 @@ +package com.baeldung.implicitsuperconstructorundefined; + +public class Person { + + private String name; + + private Integer age; + + public Person(String name, Integer age) { + this.name = name; + this.age = age; + } + + // comment this constructor to see the error. + public Person() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + +} diff --git a/core-java-modules/core-java-lang-oop-types-2/README.md b/core-java-modules/core-java-lang-oop-types-2/README.md index e1ce057035..c5e2a75f25 100644 --- a/core-java-modules/core-java-lang-oop-types-2/README.md +++ b/core-java-modules/core-java-lang-oop-types-2/README.md @@ -5,4 +5,4 @@ This module contains articles about types in Java ### Relevant Articles: - [Convert an Array of Primitives to an Array of Objects](https://www.baeldung.com/java-primitive-array-to-object-array) -- [Check if an Enum Value Exists in Java](https://www.baeldung.com/java-find-enum-by-criteria) +- [Check if an Enum Value Exists in Java](https://www.baeldung.com/java-search-enum-values) diff --git a/lombok/src/main/java/com/baeldung/lombok/with/Device.java b/lombok/src/main/java/com/baeldung/lombok/with/Device.java new file mode 100644 index 0000000000..d2c6c33feb --- /dev/null +++ b/lombok/src/main/java/com/baeldung/lombok/with/Device.java @@ -0,0 +1,13 @@ +package com.baeldung.lombok.with; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.With; + +@Getter +@AllArgsConstructor +public abstract class Device { + private final String serial; + @With + private final boolean isInspected; +} \ No newline at end of file diff --git a/lombok/src/main/java/com/baeldung/lombok/with/Holder.java b/lombok/src/main/java/com/baeldung/lombok/with/Holder.java new file mode 100644 index 0000000000..f379eae0c1 --- /dev/null +++ b/lombok/src/main/java/com/baeldung/lombok/with/Holder.java @@ -0,0 +1,16 @@ +package com.baeldung.lombok.with; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.With; + +@Getter +@AllArgsConstructor +public class Holder { + @With + private String variableA; + @With + private String _variableB; + @With + private String $variableC; +} \ No newline at end of file diff --git a/lombok/src/main/java/com/baeldung/lombok/with/ImprovedUser.java b/lombok/src/main/java/com/baeldung/lombok/with/ImprovedUser.java new file mode 100644 index 0000000000..5fafa08eda --- /dev/null +++ b/lombok/src/main/java/com/baeldung/lombok/with/ImprovedUser.java @@ -0,0 +1,14 @@ +package com.baeldung.lombok.with; + +import lombok.AllArgsConstructor; +import lombok.NonNull; +import lombok.With; + +@With +@AllArgsConstructor +public class ImprovedUser { + @NonNull + private final String username; + @NonNull + private final String emailAddress; +} \ No newline at end of file diff --git a/lombok/src/main/java/com/baeldung/lombok/with/KioskDevice.java b/lombok/src/main/java/com/baeldung/lombok/with/KioskDevice.java new file mode 100644 index 0000000000..de015b69af --- /dev/null +++ b/lombok/src/main/java/com/baeldung/lombok/with/KioskDevice.java @@ -0,0 +1,13 @@ +package com.baeldung.lombok.with; + +public class KioskDevice extends Device { + + public KioskDevice(String serial, boolean isInspected) { + super(serial, isInspected); + } + + @Override + public Device withInspected(boolean isInspected) { + return new KioskDevice(getSerial(), isInspected); + } +} \ No newline at end of file diff --git a/lombok/src/main/java/com/baeldung/lombok/with/Stock.java b/lombok/src/main/java/com/baeldung/lombok/with/Stock.java new file mode 100644 index 0000000000..33b29737cf --- /dev/null +++ b/lombok/src/main/java/com/baeldung/lombok/with/Stock.java @@ -0,0 +1,23 @@ +package com.baeldung.lombok.with; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.With; + +@Getter +@AllArgsConstructor +public class Stock { + @With + private String sku; + private int stockCount; + + public Stock withSku(String sku) { + return new Stock("mod-" + sku, stockCount); + } + + public Stock withSKU(String... sku) { + return sku == null || sku.length == 0 ? + new Stock("unknown", stockCount) : + new Stock("mod-" + sku[0], stockCount); + } +} \ No newline at end of file diff --git a/lombok/src/main/java/com/baeldung/lombok/with/User.java b/lombok/src/main/java/com/baeldung/lombok/with/User.java new file mode 100644 index 0000000000..3aa03d692b --- /dev/null +++ b/lombok/src/main/java/com/baeldung/lombok/with/User.java @@ -0,0 +1,14 @@ +package com.baeldung.lombok.with; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.With; + +@Getter +@AllArgsConstructor +public class User { + private final String username; + private final String emailAddress; + @With + private final boolean isAuthenticated; +} \ No newline at end of file diff --git a/lombok/src/test/java/com/baeldung/lombok/with/HolderUnitTest.java b/lombok/src/test/java/com/baeldung/lombok/with/HolderUnitTest.java new file mode 100644 index 0000000000..c0a3306a76 --- /dev/null +++ b/lombok/src/test/java/com/baeldung/lombok/with/HolderUnitTest.java @@ -0,0 +1,24 @@ +package com.baeldung.lombok.with; + + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotSame; + +public class HolderUnitTest { + + @Test + public void whenWithMethodsGenerated_thenUsable() { + Holder value = new Holder("a", "b"); + + Holder valueModifiedA = value.withVariableA("mod-a"); + Holder valueModifiedB = value.with_variableB("mod-b"); + // Holder valueModifiedC = value.with$VariableC("mod-c"); not possible + + assertNotSame(valueModifiedA, value); + assertNotSame(valueModifiedB, value); + assertEquals("mod-a", valueModifiedA.getVariableA()); + assertEquals("mod-b", valueModifiedB.get_variableB()); + } +} diff --git a/lombok/src/test/java/com/baeldung/lombok/with/ImprovedUserUnitTest.java b/lombok/src/test/java/com/baeldung/lombok/with/ImprovedUserUnitTest.java new file mode 100644 index 0000000000..b8d466ac4f --- /dev/null +++ b/lombok/src/test/java/com/baeldung/lombok/with/ImprovedUserUnitTest.java @@ -0,0 +1,22 @@ +package com.baeldung.lombok.with; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class ImprovedUserUnitTest { + + @Test + public void whenUsernameNull_thenException() { + ImprovedUser user = new ImprovedUser("testuser", "test@mail.com"); + + assertThrows(NullPointerException.class, () -> user.withUsername(null)); + } + + @Test + public void whenEmailNull_thenException() { + ImprovedUser user = new ImprovedUser("testuser", "test@mail.com"); + + assertThrows(NullPointerException.class, () -> user.withEmailAddress(null)); + } +} \ No newline at end of file diff --git a/lombok/src/test/java/com/baeldung/lombok/with/KioskDeviceWithUnitTest.java b/lombok/src/test/java/com/baeldung/lombok/with/KioskDeviceWithUnitTest.java new file mode 100644 index 0000000000..40bd5de8a1 --- /dev/null +++ b/lombok/src/test/java/com/baeldung/lombok/with/KioskDeviceWithUnitTest.java @@ -0,0 +1,21 @@ +package com.baeldung.lombok.with; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotSame; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class KioskDeviceWithUnitTest { + + @Test + public void whenDeviceInspected_thenClonedAndUpdated() { + KioskDevice device = new KioskDevice("S-001", false); + + Device inspectedDevice = device.withInspected(true); + + assertNotSame(inspectedDevice, device); + assertFalse(device.isInspected()); + assertTrue(inspectedDevice.isInspected()); + } +} diff --git a/lombok/src/test/java/com/baeldung/lombok/with/StockWithUnitTest.java b/lombok/src/test/java/com/baeldung/lombok/with/StockWithUnitTest.java new file mode 100644 index 0000000000..8d757e86ef --- /dev/null +++ b/lombok/src/test/java/com/baeldung/lombok/with/StockWithUnitTest.java @@ -0,0 +1,22 @@ +package com.baeldung.lombok.with; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertNotSame; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class StockWithUnitTest { + + @Test + public void givenWithManuallyProvided_whenSkuChanged_thenManualMethodUsed() { + Stock stock = new Stock("sku-001", 5); + + Stock modifiedStock = stock.withSku("sku-002"); + Stock anotherModifiedStock = stock.withSKU("sku-003", "sku-004"); + + assertNotSame(modifiedStock, stock); + assertNotSame(anotherModifiedStock, stock); + assertTrue(modifiedStock.getSku().startsWith("mod")); + assertTrue(anotherModifiedStock.getSku().startsWith("mod")); + } +} \ No newline at end of file diff --git a/lombok/src/test/java/com/baeldung/lombok/with/UserWithUnitTest.java b/lombok/src/test/java/com/baeldung/lombok/with/UserWithUnitTest.java new file mode 100644 index 0000000000..ce32ab9ee3 --- /dev/null +++ b/lombok/src/test/java/com/baeldung/lombok/with/UserWithUnitTest.java @@ -0,0 +1,21 @@ +package com.baeldung.lombok.with; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotSame; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class UserWithUnitTest { + + @Test + public void whenUserAuthenticated_thenClonedAndUpdated() { + User immutableUser = new User("testuser", "test@mail.com", false); + + User authenticatedUser = immutableUser.withAuthenticated(true); + + assertNotSame(immutableUser, authenticatedUser); + assertFalse(immutableUser.isAuthenticated()); + assertTrue(authenticatedUser.isAuthenticated()); + } +} \ No newline at end of file diff --git a/micronaut/pom.xml b/micronaut/pom.xml index 019bd6ab29..a04fc5c99c 100644 --- a/micronaut/pom.xml +++ b/micronaut/pom.xml @@ -135,7 +135,8 @@ - com.baeldung.micronaut.helloworld.server.ServerApplication + + com.baeldung.micronaut.vs.springboot.CompareApplication 1.0.0.RC2 1.8 1.3.2 diff --git a/micronaut/src/main/java/com/baeldung/micronaut/vs/springboot/CompareApplication.java b/micronaut/src/main/java/com/baeldung/micronaut/vs/springboot/CompareApplication.java new file mode 100644 index 0000000000..3375c302c2 --- /dev/null +++ b/micronaut/src/main/java/com/baeldung/micronaut/vs/springboot/CompareApplication.java @@ -0,0 +1,9 @@ +package com.baeldung.micronaut.vs.springboot; + +import io.micronaut.runtime.Micronaut; + +public class CompareApplication { + public static void main(String[] args) { + Micronaut.run(CompareApplication.class); + } +} diff --git a/micronaut/src/main/java/com/baeldung/micronaut/vs/springboot/client/ArithmeticClient.java b/micronaut/src/main/java/com/baeldung/micronaut/vs/springboot/client/ArithmeticClient.java new file mode 100644 index 0000000000..eb314d8a1d --- /dev/null +++ b/micronaut/src/main/java/com/baeldung/micronaut/vs/springboot/client/ArithmeticClient.java @@ -0,0 +1,23 @@ +package com.baeldung.micronaut.vs.springboot.client; + +import io.micronaut.http.annotation.Get; +import io.micronaut.http.client.annotation.Client; + +@Client("/math") +public interface ArithmeticClient { + + @Get("/sum/{number1}/{number2}") + String sum(float number1, float number2); + + @Get("/subtract/{number1}/{number2}") + String subtract(float number1, float number2); + + @Get("/multiply/{number1}/{number2}") + String multiply(float number1, float number2); + + @Get("/divide/{number1}/{number2}") + String divide(float number1, float number2); + + @Get("/memory") + String memory(); +} diff --git a/micronaut/src/main/java/com/baeldung/micronaut/vs/springboot/client/ArithmeticClientImpl.java b/micronaut/src/main/java/com/baeldung/micronaut/vs/springboot/client/ArithmeticClientImpl.java new file mode 100644 index 0000000000..1a9cad7981 --- /dev/null +++ b/micronaut/src/main/java/com/baeldung/micronaut/vs/springboot/client/ArithmeticClientImpl.java @@ -0,0 +1,41 @@ +package com.baeldung.micronaut.vs.springboot.client; + +import javax.inject.Singleton; + +import io.micronaut.http.HttpRequest; +import io.micronaut.http.client.RxHttpClient; +import io.micronaut.http.client.annotation.Client; + +@Singleton +public class ArithmeticClientImpl { + private RxHttpClient httpClient; + + public ArithmeticClientImpl(@Client("/") RxHttpClient httpClient) { + this.httpClient = httpClient; + } + + public String sum(float number1, float number2) { + HttpRequest req = HttpRequest.GET("/math/sum/" + number1 + "/" + number2); + return httpClient.retrieve(req).blockingFirst(); + } + + public String subtract(float number1, float number2) { + HttpRequest req = HttpRequest.GET("/math/subtract/" + number1 + "/" + number2); + return httpClient.retrieve(req).blockingFirst(); + } + + public String multiply(float number1, float number2) { + HttpRequest req = HttpRequest.GET("/math/multiply/" + number1 + "/" + number2); + return httpClient.retrieve(req).blockingFirst(); + } + + public String divide(float number1, float number2) { + HttpRequest req = HttpRequest.GET("/math/divide/" + number1 + "/" + number2); + return httpClient.retrieve(req).blockingFirst(); + } + + public String memory() { + HttpRequest req = HttpRequest.GET("/math/memory"); + return httpClient.retrieve(req).blockingFirst(); + } +} diff --git a/micronaut/src/main/java/com/baeldung/micronaut/vs/springboot/controller/ArithmeticController.java b/micronaut/src/main/java/com/baeldung/micronaut/vs/springboot/controller/ArithmeticController.java new file mode 100644 index 0000000000..930bdba029 --- /dev/null +++ b/micronaut/src/main/java/com/baeldung/micronaut/vs/springboot/controller/ArithmeticController.java @@ -0,0 +1,58 @@ +package com.baeldung.micronaut.vs.springboot.controller; + +import java.lang.management.ManagementFactory; +import java.lang.management.MemoryMXBean; + +import javax.inject.Inject; + +import com.baeldung.micronaut.vs.springboot.service.ArithmeticService; + +import io.micronaut.http.annotation.Controller; +import io.micronaut.http.annotation.Get; + +@Controller("/math") +public class ArithmeticController { + @Inject + private ArithmeticService arithmeticService; + + @Get("/sum/{number1}/{number2}") + public float getSum(float number1, float number2) { + return arithmeticService.add(number1, number2); + } + + @Get("/subtract/{number1}/{number2}") + public float getDifference(float number1, float number2) { + return arithmeticService.subtract(number1, number2); + } + + @Get("/multiply/{number1}/{number2}") + public float getMultiplication(float number1, float number2) { + return arithmeticService.multiply(number1, number2); + } + + @Get("/divide/{number1}/{number2}") + public float getDivision(float number1, float number2) { + return arithmeticService.divide(number1, number2); + } + + @Get("/memory") + public String getMemoryStatus() { + MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean(); + String memoryStats = ""; + + String init = String.format("Initial: %.2f GB \n", + (double)memoryBean.getHeapMemoryUsage().getInit() /1073741824); + String usedHeap = String.format("Used: %.2f GB \n", + (double)memoryBean.getHeapMemoryUsage().getUsed() /1073741824); + String maxHeap = String.format("Max: %.2f GB \n", + (double)memoryBean.getHeapMemoryUsage().getMax() /1073741824); + String committed = String.format("Committed: %.2f GB \n", + (double)memoryBean.getHeapMemoryUsage().getCommitted() /1073741824); + memoryStats += init; + memoryStats += usedHeap; + memoryStats += maxHeap; + memoryStats += committed; + + return memoryStats; + } +} diff --git a/micronaut/src/main/java/com/baeldung/micronaut/vs/springboot/service/ArithmeticService.java b/micronaut/src/main/java/com/baeldung/micronaut/vs/springboot/service/ArithmeticService.java new file mode 100644 index 0000000000..663f96b3b5 --- /dev/null +++ b/micronaut/src/main/java/com/baeldung/micronaut/vs/springboot/service/ArithmeticService.java @@ -0,0 +1,25 @@ +package com.baeldung.micronaut.vs.springboot.service; + +import javax.inject.Singleton; + +@Singleton +public class ArithmeticService { + public float add(float number1, float number2) { + return number1 + number2; + } + + public float subtract(float number1, float number2) { + return number1 - number2; + } + + public float multiply(float number1, float number2) { + return number1 * number2; + } + + public float divide(float number1, float number2) { + if (number2 == 0) { + throw new IllegalArgumentException("'number2' cannot be zero"); + } + return number1 / number2; + } +} diff --git a/micronaut/src/test/java/com/baeldung/micronaut/vs/springboot/ArithmeticClientUnitTest.java b/micronaut/src/test/java/com/baeldung/micronaut/vs/springboot/ArithmeticClientUnitTest.java new file mode 100644 index 0000000000..abf10d6f5e --- /dev/null +++ b/micronaut/src/test/java/com/baeldung/micronaut/vs/springboot/ArithmeticClientUnitTest.java @@ -0,0 +1,61 @@ +package com.baeldung.micronaut.vs.springboot; + +import static org.junit.Assert.assertEquals; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; + +import io.micronaut.context.ApplicationContext; +import io.micronaut.runtime.server.EmbeddedServer; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.micronaut.vs.springboot.client.ArithmeticClientImpl; + + +public class ArithmeticClientUnitTest { + private EmbeddedServer server; + private ArithmeticClientImpl client; + + @Before + public void setup() { + server = ApplicationContext.run(EmbeddedServer.class); + client = server.getApplicationContext().getBean(ArithmeticClientImpl.class); + } + + @After + public void cleanup() { + server.stop(); + } + + @Test + public void givenTwoNumbers_whenAdd_thenCorrectAnswerReturned() { + String expected = Float.valueOf(10 + 20).toString(); + assertEquals(expected, client.sum(10, 20)); + } + + @Test + public void givenTwoNumbers_whenSubtract_thenCorrectAnswerReturned() { + String expected = Float.valueOf(20 - 10).toString(); + assertEquals(expected, client.subtract(20, 10)); + } + + @Test + public void givenTwoNumbers_whenMultiply_thenCorrectAnswerReturned() { + String expected = Float.valueOf(10 * 20).toString(); + assertEquals(expected, client.multiply(10, 20)); + } + + @Test + public void givenTwoNumbers_whenDivide_thenCorrectAnswerReturned() { + String expected = Float.valueOf(30 / 10).toString(); + assertEquals(expected, client.divide(30, 10)); + } + + @Test + public void whenMemory_thenCorrectAnswerReturned() { + String expected = "Initial:"; + assertThat(client.memory(), containsString(expected)); + } +} diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/test/resources/application.properties b/persistence-modules/spring-boot-persistence-mongodb/src/test/resources/application.properties new file mode 100644 index 0000000000..ac8c1cf2d2 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/src/test/resources/application.properties @@ -0,0 +1 @@ +spring.mongodb.embedded.version=3.5.5 \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa-query-2/pom.xml b/persistence-modules/spring-data-jpa-query-2/pom.xml index 96585d9325..ebdbc2d2d9 100644 --- a/persistence-modules/spring-data-jpa-query-2/pom.xml +++ b/persistence-modules/spring-data-jpa-query-2/pom.xml @@ -30,10 +30,6 @@ com.fasterxml.jackson.core jackson-databind - - org.hibernate - hibernate-envers - javax.transaction jta @@ -56,12 +52,10 @@ org.hibernate hibernate-core - ${hibernate.version} org.hibernate hibernate-envers - ${hibernate.version} org.springframework @@ -84,8 +78,6 @@ 9.0.0.M26 1.1 21.0 - - 5.2.10.Final \ No newline at end of file diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index b0a9f41acc..ed8237771c 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -70,6 +70,7 @@ spring-boot-swagger spring-boot-swagger-jwt spring-boot-testing + spring-boot-testing-2 spring-boot-vue spring-boot-actuator spring-boot-data-2 diff --git a/spring-boot-modules/spring-boot-annotations-2/README.md b/spring-boot-modules/spring-boot-annotations-2/README.md index 991c771986..ec72620b37 100644 --- a/spring-boot-modules/spring-boot-annotations-2/README.md +++ b/spring-boot-modules/spring-boot-annotations-2/README.md @@ -5,4 +5,5 @@ This module contains articles about Spring Boot annotations ### Relevant Articles: - [Spring Conditional Annotations](https://www.baeldung.com/spring-conditional-annotations) +- [Guide to @SpringBootConfiguration in Spring Boot](https://www.baeldung.com/springbootconfiguration-annotation) - More articles: [[<-- prev]](/spring-boot-modules/spring-boot-annotations) diff --git a/spring-boot-modules/spring-boot-bootstrap/src/main/java/com/baeldung/springbootconfiguration/Application.java b/spring-boot-modules/spring-boot-annotations-2/src/main/java/com/baeldung/springbootconfiguration/Application.java similarity index 100% rename from spring-boot-modules/spring-boot-bootstrap/src/main/java/com/baeldung/springbootconfiguration/Application.java rename to spring-boot-modules/spring-boot-annotations-2/src/main/java/com/baeldung/springbootconfiguration/Application.java diff --git a/spring-boot-modules/spring-boot-bootstrap/src/main/java/com/baeldung/springbootconfiguration/PersonService.java b/spring-boot-modules/spring-boot-annotations-2/src/main/java/com/baeldung/springbootconfiguration/PersonService.java similarity index 100% rename from spring-boot-modules/spring-boot-bootstrap/src/main/java/com/baeldung/springbootconfiguration/PersonService.java rename to spring-boot-modules/spring-boot-annotations-2/src/main/java/com/baeldung/springbootconfiguration/PersonService.java diff --git a/spring-boot-modules/spring-boot-bootstrap/src/main/java/com/baeldung/springbootconfiguration/PersonServiceImpl.java b/spring-boot-modules/spring-boot-annotations-2/src/main/java/com/baeldung/springbootconfiguration/PersonServiceImpl.java similarity index 100% rename from spring-boot-modules/spring-boot-bootstrap/src/main/java/com/baeldung/springbootconfiguration/PersonServiceImpl.java rename to spring-boot-modules/spring-boot-annotations-2/src/main/java/com/baeldung/springbootconfiguration/PersonServiceImpl.java diff --git a/spring-boot-modules/spring-boot-annotations-2/src/main/resources/application.properties b/spring-boot-modules/spring-boot-annotations-2/src/main/resources/application.properties new file mode 100644 index 0000000000..ba17f62cd0 --- /dev/null +++ b/spring-boot-modules/spring-boot-annotations-2/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.main.web-application-type=none \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-annotations-2/src/test/java/com/baeldung/springbootconfiguration/SpringContextTest.java b/spring-boot-modules/spring-boot-annotations-2/src/test/java/com/baeldung/springbootconfiguration/SpringContextTest.java new file mode 100644 index 0000000000..11bbad8bb2 --- /dev/null +++ b/spring-boot-modules/spring-boot-annotations-2/src/test/java/com/baeldung/springbootconfiguration/SpringContextTest.java @@ -0,0 +1,15 @@ +package com.baeldung.springbootconfiguration; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class SpringContextTest { + + @Test + public void contextLoads() { + } +} diff --git a/spring-boot-modules/spring-boot-bootstrap/README.md b/spring-boot-modules/spring-boot-bootstrap/README.md index 02ec52f755..5787f3262d 100644 --- a/spring-boot-modules/spring-boot-bootstrap/README.md +++ b/spring-boot-modules/spring-boot-bootstrap/README.md @@ -9,5 +9,4 @@ This module contains articles about bootstrapping Spring Boot applications. - [Deploy a Spring Boot Application to Google App Engine](https://www.baeldung.com/spring-boot-google-app-engine) - [Deploy a Spring Boot Application to OpenShift](https://www.baeldung.com/spring-boot-deploy-openshift) - [Deploy a Spring Boot Application to AWS Beanstalk](https://www.baeldung.com/spring-boot-deploy-aws-beanstalk) -- [Guide to @SpringBootConfiguration in Spring Boot](https://www.baeldung.com/springbootconfiguration-annotation) - [Implement Health Checks in OpenShift](https://www.baeldung.com/ops/openshift-health-checks) diff --git a/spring-boot-modules/spring-boot-environment/src/main/java/com/baeldung/prefix/PrefixController.java b/spring-boot-modules/spring-boot-environment/src/main/java/com/baeldung/prefix/PrefixController.java index 00b728c7ae..dc6b0cd513 100644 --- a/spring-boot-modules/spring-boot-environment/src/main/java/com/baeldung/prefix/PrefixController.java +++ b/spring-boot-modules/spring-boot-environment/src/main/java/com/baeldung/prefix/PrefixController.java @@ -1,6 +1,7 @@ package com.baeldung.prefix; -import org.springframework.beans.factory.annotation.Value; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @@ -8,12 +9,12 @@ import org.springframework.web.bind.annotation.GetMapping; @Controller public class PrefixController { - @Value(value = "${server.port}") - private int serverPort; + @Autowired + private Environment environment; @GetMapping("/prefix") public String getServerPortInfo(final Model model) { - model.addAttribute("serverPort", serverPort); + model.addAttribute("serverPort", environment.getProperty("server.port")); return "prefix"; } } diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/JobRunrSpringBootApp.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/JobRunrSpringBootApp.java index 061dba15bf..3821332132 100644 --- a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/JobRunrSpringBootApp.java +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/JobRunrSpringBootApp.java @@ -1,15 +1,11 @@ package com.baeldung; import com.baeldung.jobrunr.service.SampleJobService; -import org.jobrunr.jobs.mappers.JobMapper; import org.jobrunr.scheduling.JobScheduler; import org.jobrunr.scheduling.cron.Cron; -import org.jobrunr.storage.InMemoryStorageProvider; -import org.jobrunr.storage.StorageProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; import javax.annotation.PostConstruct; @@ -23,13 +19,6 @@ public class JobRunrSpringBootApp { SpringApplication.run(JobRunrSpringBootApp.class, args); } - @Bean - public StorageProvider storageProvider(JobMapper jobMapper) { - InMemoryStorageProvider storageProvider = new InMemoryStorageProvider(); - storageProvider.setJobMapper(jobMapper); - return storageProvider; - } - @PostConstruct public void scheduleRecurrently() { jobScheduler.scheduleRecurrently(Cron.every5minutes(), x -> x.executeSampleJob("a recurring job")); diff --git a/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/config/StorageProviderConfig.java b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/config/StorageProviderConfig.java new file mode 100644 index 0000000000..e4b8cf12d7 --- /dev/null +++ b/spring-boot-modules/spring-boot-libraries-2/src/main/java/com/baeldung/config/StorageProviderConfig.java @@ -0,0 +1,18 @@ +package com.baeldung.config; + +import org.jobrunr.jobs.mappers.JobMapper; +import org.jobrunr.storage.InMemoryStorageProvider; +import org.jobrunr.storage.StorageProvider; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class StorageProviderConfig { + + @Bean + public StorageProvider storageProvider(JobMapper jobMapper) { + InMemoryStorageProvider storageProvider = new InMemoryStorageProvider(); + storageProvider.setJobMapper(jobMapper); + return storageProvider; + } +} diff --git a/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/micronaut/vs/springboot/CompareApplication.java b/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/micronaut/vs/springboot/CompareApplication.java new file mode 100644 index 0000000000..5bf1e0a57c --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/micronaut/vs/springboot/CompareApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.micronaut.vs.springboot; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.annotation.ComponentScan; + +@EnableAutoConfiguration +@ComponentScan("com.baeldung.micronaut.vs.springboot") +public class CompareApplication { + public static void main(final String[] args) { + SpringApplication.run(CompareApplication.class, args); + } +} diff --git a/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/micronaut/vs/springboot/controller/ArithmeticController.java b/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/micronaut/vs/springboot/controller/ArithmeticController.java new file mode 100644 index 0000000000..2bb8046f66 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/micronaut/vs/springboot/controller/ArithmeticController.java @@ -0,0 +1,60 @@ +package com.baeldung.micronaut.vs.springboot.controller; + +import java.lang.management.ManagementFactory; +import java.lang.management.MemoryMXBean; + +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.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.micronaut.vs.springboot.service.ArithmeticService; + +@RestController +@RequestMapping("/math") +public class ArithmeticController { + @Autowired + private ArithmeticService arithmeticService; + + @GetMapping("/sum/{number1}/{number2}") + public float getSum(@PathVariable("number1") float number1, @PathVariable("number2") float number2) { + return arithmeticService.add(number1, number2); + } + + @GetMapping("/subtract/{number1}/{number2}") + public float getDifference(@PathVariable("number1") float number1, @PathVariable("number2") float number2) { + return arithmeticService.subtract(number1, number2); + } + + @GetMapping("/multiply/{number1}/{number2}") + public float getMultiplication(@PathVariable("number1") float number1, @PathVariable("number2") float number2) { + return arithmeticService.multiply(number1, number2); + } + + @GetMapping("/divide/{number1}/{number2}") + public float getDivision(@PathVariable("number1") float number1, @PathVariable("number2") float number2) { + return arithmeticService.divide(number1, number2); + } + + @GetMapping("/memory") + public String getMemoryStatus() { + MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean(); + String memoryStats = ""; + + String init = String.format("Initial: %.2f GB \n", + (double)memoryBean.getHeapMemoryUsage().getInit() /1073741824); + String usedHeap = String.format("Used: %.2f GB \n", + (double)memoryBean.getHeapMemoryUsage().getUsed() /1073741824); + String maxHeap = String.format("Max: %.2f GB \n", + (double)memoryBean.getHeapMemoryUsage().getMax() /1073741824); + String committed = String.format("Committed: %.2f GB \n", + (double)memoryBean.getHeapMemoryUsage().getCommitted() /1073741824); + memoryStats += init; + memoryStats += usedHeap; + memoryStats += maxHeap; + memoryStats += committed; + + return memoryStats; + } +} diff --git a/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/micronaut/vs/springboot/service/ArithmeticService.java b/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/micronaut/vs/springboot/service/ArithmeticService.java new file mode 100644 index 0000000000..485cfd4d8c --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-3/src/main/java/com/baeldung/micronaut/vs/springboot/service/ArithmeticService.java @@ -0,0 +1,25 @@ +package com.baeldung.micronaut.vs.springboot.service; + +import org.springframework.stereotype.Service; + +@Service +public class ArithmeticService { + public float add(float number1, float number2) { + return number1 + number2; + } + + public float subtract(float number1, float number2) { + return number1 - number2; + } + + public float multiply(float number1, float number2) { + return number1 * number2; + } + + public float divide(float number1, float number2) { + if (number2 == 0) { + throw new IllegalArgumentException("'number2' cannot be zero"); + } + return number1 / number2; + } +} diff --git a/spring-boot-modules/spring-boot-mvc-3/src/test/java/com/baeldung/micronaut/vs/springboot/controller/ArithmeticControllerUnitTest.java b/spring-boot-modules/spring-boot-mvc-3/src/test/java/com/baeldung/micronaut/vs/springboot/controller/ArithmeticControllerUnitTest.java new file mode 100644 index 0000000000..8734faef54 --- /dev/null +++ b/spring-boot-modules/spring-boot-mvc-3/src/test/java/com/baeldung/micronaut/vs/springboot/controller/ArithmeticControllerUnitTest.java @@ -0,0 +1,68 @@ +package com.baeldung.micronaut.vs.springboot.controller; + +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.jupiter.api.Test; + +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.hamcrest.Matchers.containsString; + +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.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +import com.baeldung.micronaut.vs.springboot.CompareApplication; + +@SpringBootTest(classes = CompareApplication.class) +@AutoConfigureMockMvc +public class ArithmeticControllerUnitTest { + @Autowired + private MockMvc mockMvc; + + @Test + public void givenTwoNumbers_whenAdd_thenCorrectAnswerReturned() throws Exception { + Float expected = Float.valueOf(10 + 20); + this.mockMvc.perform(MockMvcRequestBuilders.get("/math/sum/10/20") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string(expected.toString())); + } + + @Test + public void givenTwoNumbers_whenSubtract_thenCorrectAnswerReturned() throws Exception { + Float expected = Float.valueOf(20 - 10); + this.mockMvc.perform(MockMvcRequestBuilders.get("/math/subtract/20/10") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string(expected.toString())); + } + + @Test + public void givenTwoNumbers_whenMultiply_thenCorrectAnswerReturned() throws Exception { + Float expected = Float.valueOf(20 * 10); + this.mockMvc.perform(MockMvcRequestBuilders.get("/math/multiply/20/10") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string(expected.toString())); + } + + @Test + public void givenTwoNumbers_whenDivide_thenCorrectAnswerReturned() throws Exception { + Float expected = Float.valueOf(20 / 10); + this.mockMvc.perform(MockMvcRequestBuilders.get("/math/divide/20/10") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string(expected.toString())); + } + + @Test + public void whenMemory_thenMemoryStringReturned() throws Exception { + this.mockMvc.perform(MockMvcRequestBuilders.get("/math/memory") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("Initial:"))); + } +} diff --git a/spring-boot-modules/spring-boot-runtime/pom.xml b/spring-boot-modules/spring-boot-runtime/pom.xml index d42ae303a7..2f25c28b06 100644 --- a/spring-boot-modules/spring-boot-runtime/pom.xml +++ b/spring-boot-modules/spring-boot-runtime/pom.xml @@ -95,7 +95,7 @@ 2.2 18.0 3.1.7 - 3.0.2 + 3.1.0 4.5.8 diff --git a/spring-boot-modules/spring-boot-testing-2/.gitignore b/spring-boot-modules/spring-boot-testing-2/.gitignore new file mode 100644 index 0000000000..da7c2c5c0a --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/.gitignore @@ -0,0 +1,5 @@ +/target/ +.settings/ +.classpath +.project + diff --git a/spring-boot-modules/spring-boot-testing-2/README.md b/spring-boot-modules/spring-boot-testing-2/README.md new file mode 100644 index 0000000000..33664a4448 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/README.md @@ -0,0 +1,12 @@ +## Spring Boot Testing + +This module contains articles about Spring Boot testing + +### The Course + +The "REST With Spring" Classes: http://bit.ly/restwithspring + +### Relevant Articles: + +- [Setting the Log Level in Spring Boot when Testing](https://www.baeldung.com/spring-boot-testing-log-level) +- More articles: [[<-- prev]](../spring-boot-testing) \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-testing-2/pom.xml b/spring-boot-modules/spring-boot-testing-2/pom.xml new file mode 100644 index 0000000000..d1000156c6 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + spring-boot-testing-2 + spring-boot-testing-2 + jar + This is simple boot application for demonstrating testing features. + + + com.baeldung.spring-boot-modules + spring-boot-modules + 1.0.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + + + com.baeldung.boot.Application + + + diff --git a/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/boot/Application.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/boot/Application.java new file mode 100644 index 0000000000..a78bb0410b --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/boot/Application.java @@ -0,0 +1,12 @@ +package com.baeldung.boot; + +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-boot-modules/spring-boot-testing/src/main/java/com/baeldung/component/OtherComponent.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/component/OtherComponent.java similarity index 100% rename from spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/component/OtherComponent.java rename to spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/component/OtherComponent.java diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/testloglevel/TestLogLevelApplication.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/testloglevel/TestLogLevelApplication.java similarity index 100% rename from spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/testloglevel/TestLogLevelApplication.java rename to spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/testloglevel/TestLogLevelApplication.java diff --git a/spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/testloglevel/TestLogLevelController.java b/spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/testloglevel/TestLogLevelController.java similarity index 100% rename from spring-boot-modules/spring-boot-testing/src/main/java/com/baeldung/testloglevel/TestLogLevelController.java rename to spring-boot-modules/spring-boot-testing-2/src/main/java/com/baeldung/testloglevel/TestLogLevelController.java diff --git a/spring-boot-modules/spring-boot-testing-2/src/main/resources/application.properties b/spring-boot-modules/spring-boot-testing-2/src/main/resources/application.properties new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/boot/SpringContextTest.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/boot/SpringContextTest.java new file mode 100644 index 0000000000..f3c8b9a954 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/boot/SpringContextTest.java @@ -0,0 +1,15 @@ +package com.baeldung.boot; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class) +public class SpringContextTest { + + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { + } +} diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/testloglevel/LogbackMultiProfileTestLogLevelIntegrationTest.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/testloglevel/LogbackMultiProfileTestLogLevelIntegrationTest.java similarity index 100% rename from spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/testloglevel/LogbackMultiProfileTestLogLevelIntegrationTest.java rename to spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/testloglevel/LogbackMultiProfileTestLogLevelIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/testloglevel/LogbackTestLogLevelIntegrationTest.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/testloglevel/LogbackTestLogLevelIntegrationTest.java similarity index 100% rename from spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/testloglevel/LogbackTestLogLevelIntegrationTest.java rename to spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/testloglevel/LogbackTestLogLevelIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/testloglevel/TestLogLevelWithProfileIntegrationTest.java b/spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/testloglevel/TestLogLevelWithProfileIntegrationTest.java similarity index 100% rename from spring-boot-modules/spring-boot-testing/src/test/java/com/baeldung/testloglevel/TestLogLevelWithProfileIntegrationTest.java rename to spring-boot-modules/spring-boot-testing-2/src/test/java/com/baeldung/testloglevel/TestLogLevelWithProfileIntegrationTest.java diff --git a/spring-boot-modules/spring-boot-testing/src/test/resources/application-logback-test.properties b/spring-boot-modules/spring-boot-testing-2/src/test/resources/application-logback-test.properties similarity index 100% rename from spring-boot-modules/spring-boot-testing/src/test/resources/application-logback-test.properties rename to spring-boot-modules/spring-boot-testing-2/src/test/resources/application-logback-test.properties diff --git a/spring-boot-modules/spring-boot-testing/src/test/resources/application-logback-test2.properties b/spring-boot-modules/spring-boot-testing-2/src/test/resources/application-logback-test2.properties similarity index 100% rename from spring-boot-modules/spring-boot-testing/src/test/resources/application-logback-test2.properties rename to spring-boot-modules/spring-boot-testing-2/src/test/resources/application-logback-test2.properties diff --git a/spring-boot-modules/spring-boot-testing/src/test/resources/application-logging-test.properties b/spring-boot-modules/spring-boot-testing-2/src/test/resources/application-logging-test.properties similarity index 100% rename from spring-boot-modules/spring-boot-testing/src/test/resources/application-logging-test.properties rename to spring-boot-modules/spring-boot-testing-2/src/test/resources/application-logging-test.properties diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/resources/application.properties b/spring-boot-modules/spring-boot-testing-2/src/test/resources/application.properties new file mode 100644 index 0000000000..2b406d1c6e --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/test/resources/application.properties @@ -0,0 +1,3 @@ +# logging.level.com.baeldung.testloglevel=DEBUG + +# logging.level.root=INFO diff --git a/spring-boot-modules/spring-boot-testing/src/test/resources/logback-multiprofile.xml b/spring-boot-modules/spring-boot-testing-2/src/test/resources/logback-multiprofile.xml similarity index 100% rename from spring-boot-modules/spring-boot-testing/src/test/resources/logback-multiprofile.xml rename to spring-boot-modules/spring-boot-testing-2/src/test/resources/logback-multiprofile.xml diff --git a/spring-boot-modules/spring-boot-testing-2/src/test/resources/logback-test.xml b/spring-boot-modules/spring-boot-testing-2/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..0528aa88f3 --- /dev/null +++ b/spring-boot-modules/spring-boot-testing-2/src/test/resources/logback-test.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + diff --git a/spring-boot-modules/spring-boot-testing/README.md b/spring-boot-modules/spring-boot-testing/README.md index 058c78c9bb..4d23c32422 100644 --- a/spring-boot-modules/spring-boot-testing/README.md +++ b/spring-boot-modules/spring-boot-testing/README.md @@ -10,9 +10,9 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Testing with Spring and Spock](https://www.baeldung.com/spring-spock-testing) - [Exclude Auto-Configuration Classes in Spring Boot Tests](https://www.baeldung.com/spring-boot-exclude-auto-configuration-test) -- [Setting the Log Level in Spring Boot when Testing](https://www.baeldung.com/spring-boot-testing-log-level) - [Embedded Redis Server with Spring Boot Test](https://www.baeldung.com/spring-embedded-redis) - [Testing Spring Boot @ConfigurationProperties](https://www.baeldung.com/spring-boot-testing-configurationproperties) - [Prevent ApplicationRunner or CommandLineRunner Beans From Executing During Junit Testing](https://www.baeldung.com/spring-junit-prevent-runner-beans-testing-execution) - [Testing in Spring Boot](https://www.baeldung.com/spring-boot-testing) - [Fixing the NoSuchMethodError JUnit Error](https://www.baeldung.com/junit-nosuchmethoderror) +- More articles: [[more -->]](../spring-boot-testing-2) \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-testing/src/test/resources/logback-test.xml b/spring-boot-modules/spring-boot-testing/src/test/resources/logback-test.xml index 0528aa88f3..9553dcad41 100644 --- a/spring-boot-modules/spring-boot-testing/src/test/resources/logback-test.xml +++ b/spring-boot-modules/spring-boot-testing/src/test/resources/logback-test.xml @@ -9,5 +9,4 @@ - diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-rate-limiting/pom.xml b/spring-cloud/spring-cloud-zuul/spring-zuul-rate-limiting/pom.xml index e09fcd3711..2969b5eed9 100644 --- a/spring-cloud/spring-cloud-zuul/spring-zuul-rate-limiting/pom.xml +++ b/spring-cloud/spring-cloud-zuul/spring-zuul-rate-limiting/pom.xml @@ -42,6 +42,8 @@ 2.2.0.RELEASE + 2.4.7 + 2020.0.4 \ No newline at end of file diff --git a/spring-security-modules/spring-security-web-thymeleaf/src/main/java/com/baeldung/springsecuritythymeleaf/PasswordEncoderConfiguration.java b/spring-security-modules/spring-security-web-thymeleaf/src/main/java/com/baeldung/springsecuritythymeleaf/PasswordEncoderConfiguration.java new file mode 100644 index 0000000000..5ffe2c35f9 --- /dev/null +++ b/spring-security-modules/spring-security-web-thymeleaf/src/main/java/com/baeldung/springsecuritythymeleaf/PasswordEncoderConfiguration.java @@ -0,0 +1,15 @@ +package com.baeldung.springsecuritythymeleaf; + +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 PasswordEncoderConfiguration { + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } +} diff --git a/spring-security-modules/spring-security-web-thymeleaf/src/main/java/com/baeldung/springsecuritythymeleaf/SecurityConfiguration.java b/spring-security-modules/spring-security-web-thymeleaf/src/main/java/com/baeldung/springsecuritythymeleaf/SecurityConfiguration.java index f7f8cfb708..8e9047f629 100644 --- a/spring-security-modules/spring-security-web-thymeleaf/src/main/java/com/baeldung/springsecuritythymeleaf/SecurityConfiguration.java +++ b/spring-security-modules/spring-security-web-thymeleaf/src/main/java/com/baeldung/springsecuritythymeleaf/SecurityConfiguration.java @@ -8,6 +8,7 @@ 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; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; @Configuration @@ -32,19 +33,15 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter { } @Autowired - public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { + public void configureGlobal(AuthenticationManagerBuilder auth, PasswordEncoder passwordEncoder) throws Exception { auth.inMemoryAuthentication() .withUser("user") - .password(passwordEncoder().encode("password")) + .password(passwordEncoder.encode("password")) .roles("USER") .and() .withUser("admin") - .password(passwordEncoder().encode("admin")) + .password(passwordEncoder.encode("admin")) .roles("ADMIN"); } - - @Bean - public BCryptPasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); - } + } diff --git a/spring-security-modules/spring-security-web-thymeleaf/src/test/java/com/baeldung/springsecuritythymeleaf/ViewControllerIntegrationTest.java b/spring-security-modules/spring-security-web-thymeleaf/src/test/java/com/baeldung/springsecuritythymeleaf/ViewControllerIntegrationTest.java index c87d1bacc3..606a33dcf5 100644 --- a/spring-security-modules/spring-security-web-thymeleaf/src/test/java/com/baeldung/springsecuritythymeleaf/ViewControllerIntegrationTest.java +++ b/spring-security-modules/spring-security-web-thymeleaf/src/test/java/com/baeldung/springsecuritythymeleaf/ViewControllerIntegrationTest.java @@ -9,11 +9,13 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.context.annotation.Import; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; @RunWith(SpringRunner.class) @WebMvcTest +@Import(PasswordEncoderConfiguration.class) public class ViewControllerIntegrationTest { @Autowired diff --git a/spring-security-modules/spring-session/spring-session-redis/src/main/java/com/baeldung/spring/session/PasswordEncoderConfig.java b/spring-security-modules/spring-session/spring-session-redis/src/main/java/com/baeldung/spring/session/PasswordEncoderConfig.java new file mode 100644 index 0000000000..d9d0725204 --- /dev/null +++ b/spring-security-modules/spring-session/spring-session-redis/src/main/java/com/baeldung/spring/session/PasswordEncoderConfig.java @@ -0,0 +1,15 @@ +package com.baeldung.spring.session; + +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 PasswordEncoderConfig { + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } +} diff --git a/spring-security-modules/spring-session/spring-session-redis/src/main/java/com/baeldung/spring/session/SecurityConfig.java b/spring-security-modules/spring-session/spring-session-redis/src/main/java/com/baeldung/spring/session/SecurityConfig.java index 678c98e7eb..d9476d7704 100644 --- a/spring-security-modules/spring-session/spring-session-redis/src/main/java/com/baeldung/spring/session/SecurityConfig.java +++ b/spring-security-modules/spring-session/spring-session-redis/src/main/java/com/baeldung/spring/session/SecurityConfig.java @@ -15,8 +15,8 @@ import org.springframework.security.crypto.password.PasswordEncoder; public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired - public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { - auth.inMemoryAuthentication().withUser("admin").password(passwordEncoder().encode("password")).roles("ADMIN"); + public void configureGlobal(AuthenticationManagerBuilder auth, PasswordEncoder passwordEncoder) throws Exception { + auth.inMemoryAuthentication().withUser("admin").password(passwordEncoder.encode("password")).roles("ADMIN"); } @Override @@ -24,8 +24,4 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { http.httpBasic().and().authorizeRequests().antMatchers("/").hasRole("ADMIN").anyRequest().authenticated(); } - @Bean - public PasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); - } } diff --git a/spring-web-modules/pom.xml b/spring-web-modules/pom.xml index 96aeb514a0..b84ea5a13a 100644 --- a/spring-web-modules/pom.xml +++ b/spring-web-modules/pom.xml @@ -30,6 +30,7 @@ spring-mvc-views spring-mvc-webflow spring-mvc-xml + spring-mvc-xml-2 spring-rest-angular spring-rest-http spring-rest-http-2 @@ -47,4 +48,4 @@ spring-web-url - \ No newline at end of file + diff --git a/spring-web-modules/spring-mvc-xml-2/.gitignore b/spring-web-modules/spring-mvc-xml-2/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/spring-web-modules/spring-mvc-xml-2/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-xml-2/README.md b/spring-web-modules/spring-mvc-xml-2/README.md new file mode 100644 index 0000000000..05a6172fa1 --- /dev/null +++ b/spring-web-modules/spring-mvc-xml-2/README.md @@ -0,0 +1,14 @@ +## Spring MVC XML + +This module contains articles about Spring MVC with XML configuration + +### The Course + +The "REST With Spring" Classes: http://bit.ly/restwithspring + +### Relevant Articles: + +- [Exploring SpringMVC’s Form Tag Library](https://www.baeldung.com/spring-mvc-form-tags) +- [Validating RequestParams and PathVariables in Spring](https://www.baeldung.com/spring-validate-requestparam-pathvariable) +- [Debugging the Spring MVC 404 “No mapping found for HTTP request” Error](https://www.baeldung.com/spring-mvc-404-error) +- More articles: [[<-- prev]](../spring-mvc-xml) diff --git a/spring-web-modules/spring-mvc-xml-2/pom.xml b/spring-web-modules/spring-mvc-xml-2/pom.xml new file mode 100644 index 0000000000..e65259d512 --- /dev/null +++ b/spring-web-modules/spring-mvc-xml-2/pom.xml @@ -0,0 +1,101 @@ + + + 4.0.0 + spring-mvc-xml-2 + 0.1-SNAPSHOT + spring-mvc-xml-2 + war + + + com.baeldung + spring-web-modules + 0.0.1-SNAPSHOT + + + + + + org.springframework + spring-web + ${org.springframework.version} + + + org.springframework + spring-webmvc + ${org.springframework.version} + + + + javax.servlet + javax.servlet-api + ${javax.servlet-api.version} + provided + + + javax.servlet + jstl + ${jstl.version} + runtime + + + org.hibernate.validator + hibernate-validator + ${hibernate-validator.version} + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + commons-io + commons-io + ${commons-io.version} + + + org.glassfish + javax.el + ${javax.el.version} + + + org.springframework.boot + spring-boot-starter-test + ${spring-boot.version} + test + + + + + spring-mvc-xml + + + src/main/resources + true + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven-war-plugin.version} + + + + + + 5.0.2.RELEASE + 1.5.10.RELEASE + 5.1.40 + 4.4.5 + 4.5.2 + 6.0.10.Final + 3.0.1-b08 + 19.0 + 1.6.1 + + + diff --git a/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/ClientWebConfig.java b/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/ClientWebConfig.java new file mode 100644 index 0000000000..a464717f5d --- /dev/null +++ b/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/ClientWebConfig.java @@ -0,0 +1,17 @@ +package com.baeldung.spring; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.ImportResource; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@ImportResource("classpath:webMvcConfig.xml") +@Configuration +@ComponentScan +public class ClientWebConfig implements WebMvcConfigurer { + + public ClientWebConfig() { + super(); + } + +} \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-xml/src/main/java/com/baeldung/spring/ClientWebConfigJava.java b/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/ClientWebConfigJava.java similarity index 96% rename from spring-web-modules/spring-mvc-xml/src/main/java/com/baeldung/spring/ClientWebConfigJava.java rename to spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/ClientWebConfigJava.java index 09c34ccc80..dc8db43e41 100644 --- a/spring-web-modules/spring-mvc-xml/src/main/java/com/baeldung/spring/ClientWebConfigJava.java +++ b/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/ClientWebConfigJava.java @@ -6,6 +6,7 @@ import java.util.ResourceBundle; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; import org.springframework.context.support.MessageSourceResourceBundle; import org.springframework.context.support.ResourceBundleMessageSource; import org.springframework.validation.beanvalidation.MethodValidationPostProcessor; @@ -54,7 +55,7 @@ public class ClientWebConfigJava implements WebMvcConfigurer { return bean; } - + @Bean public MethodValidationPostProcessor methodValidationPostProcessor() { return new MethodValidationPostProcessor(); diff --git a/spring-web-modules/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ConstraintViolationExceptionHandler.java b/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/controller/ConstraintViolationExceptionHandler.java similarity index 100% rename from spring-web-modules/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/ConstraintViolationExceptionHandler.java rename to spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/controller/ConstraintViolationExceptionHandler.java diff --git a/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/nomapping/GreetingController.java b/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/nomapping/GreetingController.java new file mode 100644 index 0000000000..5016113d30 --- /dev/null +++ b/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/nomapping/GreetingController.java @@ -0,0 +1,16 @@ +package com.baeldung.spring.nomapping; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@Controller +public class GreetingController { + + @RequestMapping(value = "/greeting", method = RequestMethod.GET) + public String get(ModelMap model) { + model.addAttribute("message", "Hello, World!"); + return "greeting"; + } +} \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/RequestAndPathVariableValidationController.java b/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/paramsvalidation/RequestAndPathVariableValidationController.java similarity index 79% rename from spring-web-modules/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/RequestAndPathVariableValidationController.java rename to spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/paramsvalidation/RequestAndPathVariableValidationController.java index b77598c113..4768237871 100644 --- a/spring-web-modules/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/RequestAndPathVariableValidationController.java +++ b/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/paramsvalidation/RequestAndPathVariableValidationController.java @@ -1,12 +1,17 @@ -package com.baeldung.spring.controller; +package com.baeldung.spring.paramsvalidation; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.GetMapping; import org.springframework.validation.annotation.Validated; -import javax.validation.constraints.*; +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.RequestParam; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; @Controller @RequestMapping("/public/api/1") diff --git a/spring-web-modules/spring-mvc-xml/src/main/java/com/baeldung/spring/form/Person.java b/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/taglibrary/Person.java similarity index 98% rename from spring-web-modules/spring-mvc-xml/src/main/java/com/baeldung/spring/form/Person.java rename to spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/taglibrary/Person.java index 307a36b10f..ed2fa903ef 100644 --- a/spring-web-modules/spring-mvc-xml/src/main/java/com/baeldung/spring/form/Person.java +++ b/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/taglibrary/Person.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.form; +package com.baeldung.spring.taglibrary; import java.util.List; diff --git a/spring-web-modules/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/PersonController.java b/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/taglibrary/PersonController.java similarity index 95% rename from spring-web-modules/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/PersonController.java rename to spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/taglibrary/PersonController.java index 71d9ad7845..0fcb66f2dd 100644 --- a/spring-web-modules/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/PersonController.java +++ b/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/taglibrary/PersonController.java @@ -1,14 +1,5 @@ -package com.baeldung.spring.controller; +package com.baeldung.spring.taglibrary; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import javax.validation.Valid; - -import com.baeldung.spring.form.Person; -import com.baeldung.spring.validator.PersonValidator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -19,6 +10,12 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; +import javax.validation.Valid; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + @Controller public class PersonController { diff --git a/spring-web-modules/spring-mvc-xml/src/main/java/com/baeldung/spring/validator/PersonValidator.java b/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/taglibrary/PersonValidator.java similarity index 87% rename from spring-web-modules/spring-mvc-xml/src/main/java/com/baeldung/spring/validator/PersonValidator.java rename to spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/taglibrary/PersonValidator.java index cda756cdfc..9f437429ae 100644 --- a/spring-web-modules/spring-mvc-xml/src/main/java/com/baeldung/spring/validator/PersonValidator.java +++ b/spring-web-modules/spring-mvc-xml-2/src/main/java/com/baeldung/spring/taglibrary/PersonValidator.java @@ -1,6 +1,5 @@ -package com.baeldung.spring.validator; +package com.baeldung.spring.taglibrary; -import com.baeldung.spring.form.Person; import org.springframework.stereotype.Component; import org.springframework.validation.Errors; import org.springframework.validation.ValidationUtils; diff --git a/spring-web-modules/spring-mvc-xml-2/src/main/resources/logback.xml b/spring-web-modules/spring-mvc-xml-2/src/main/resources/logback.xml new file mode 100644 index 0000000000..56af2d397e --- /dev/null +++ b/spring-web-modules/spring-mvc-xml-2/src/main/resources/logback.xml @@ -0,0 +1,19 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-xml-2/src/main/resources/messages.properties b/spring-web-modules/spring-mvc-xml-2/src/main/resources/messages.properties new file mode 100644 index 0000000000..a58f51db3e --- /dev/null +++ b/spring-web-modules/spring-mvc-xml-2/src/main/resources/messages.properties @@ -0,0 +1,3 @@ +required.name = Name is required! +NotEmpty.person.password = Password is required! + diff --git a/spring-web-modules/spring-mvc-xml-2/src/main/resources/webMvcConfig.xml b/spring-web-modules/spring-mvc-xml-2/src/main/resources/webMvcConfig.xml new file mode 100644 index 0000000000..5dcdef6ad4 --- /dev/null +++ b/spring-web-modules/spring-mvc-xml-2/src/main/resources/webMvcConfig.xml @@ -0,0 +1,40 @@ + + + + + + + + + image/jpeg + image/png + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-web-modules/spring-mvc-xml-2/src/main/webapp/WEB-INF/mvc-servlet.xml b/spring-web-modules/spring-mvc-xml-2/src/main/webapp/WEB-INF/mvc-servlet.xml new file mode 100644 index 0000000000..e27665da95 --- /dev/null +++ b/spring-web-modules/spring-mvc-xml-2/src/main/webapp/WEB-INF/mvc-servlet.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/spring-web-modules/spring-mvc-xml-2/src/main/webapp/WEB-INF/view/greeting.jsp b/spring-web-modules/spring-mvc-xml-2/src/main/webapp/WEB-INF/view/greeting.jsp new file mode 100644 index 0000000000..ac17c75ab7 --- /dev/null +++ b/spring-web-modules/spring-mvc-xml-2/src/main/webapp/WEB-INF/view/greeting.jsp @@ -0,0 +1,9 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Greeting + + +

${message}

+ + \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-xml/src/main/webapp/WEB-INF/view/personForm.jsp b/spring-web-modules/spring-mvc-xml-2/src/main/webapp/WEB-INF/view/personForm.jsp similarity index 100% rename from spring-web-modules/spring-mvc-xml/src/main/webapp/WEB-INF/view/personForm.jsp rename to spring-web-modules/spring-mvc-xml-2/src/main/webapp/WEB-INF/view/personForm.jsp diff --git a/spring-web-modules/spring-mvc-xml/src/main/webapp/WEB-INF/view/personView.jsp b/spring-web-modules/spring-mvc-xml-2/src/main/webapp/WEB-INF/view/personView.jsp similarity index 100% rename from spring-web-modules/spring-mvc-xml/src/main/webapp/WEB-INF/view/personView.jsp rename to spring-web-modules/spring-mvc-xml-2/src/main/webapp/WEB-INF/view/personView.jsp diff --git a/spring-web-modules/spring-mvc-xml-2/src/main/webapp/WEB-INF/view/sample.jsp b/spring-web-modules/spring-mvc-xml-2/src/main/webapp/WEB-INF/view/sample.jsp new file mode 100644 index 0000000000..7cc14b5dcd --- /dev/null +++ b/spring-web-modules/spring-mvc-xml-2/src/main/webapp/WEB-INF/view/sample.jsp @@ -0,0 +1,7 @@ + + + + +

This is the body of the sample view

+ + \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-xml-2/src/main/webapp/WEB-INF/web.xml b/spring-web-modules/spring-mvc-xml-2/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..e704d2eba3 --- /dev/null +++ b/spring-web-modules/spring-mvc-xml-2/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,47 @@ + + + Spring MVC XML Application + + + + contextClass + + org.springframework.web.context.support.AnnotationConfigWebApplicationContext + + + + contextConfigLocation + com.baeldung.spring + + + + org.springframework.web.context.ContextLoaderListener + + + + + mvc + org.springframework.web.servlet.DispatcherServlet + 1 + + + mvc + / + + + + + 10 + + + index.jsp + + + + /errors + + diff --git a/spring-web-modules/spring-mvc-xml-2/src/main/webapp/index.jsp b/spring-web-modules/spring-mvc-xml-2/src/main/webapp/index.jsp new file mode 100644 index 0000000000..14872cf3ba --- /dev/null +++ b/spring-web-modules/spring-mvc-xml-2/src/main/webapp/index.jsp @@ -0,0 +1,15 @@ +<%@ page language="java" contentType="text/html; charset=ISO-8859-1" + pageEncoding="ISO-8859-1"%> + + + + +Spring MVC Examples + + + +

Spring MVC Examples

+ + + \ No newline at end of file diff --git a/spring-web-modules/spring-mvc-xml-2/src/test/java/com/baeldung/SpringContextTest.java b/spring-web-modules/spring-mvc-xml-2/src/test/java/com/baeldung/SpringContextTest.java new file mode 100644 index 0000000000..62e34859ee --- /dev/null +++ b/spring-web-modules/spring-mvc-xml-2/src/test/java/com/baeldung/SpringContextTest.java @@ -0,0 +1,19 @@ +package com.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; + +import com.baeldung.spring.ClientWebConfig; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = ClientWebConfig.class) +@WebAppConfiguration +public class SpringContextTest { + + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { + } +} diff --git a/spring-web-modules/spring-mvc-xml/src/test/java/com/baeldung/spring/controller/RequestAndPathVariableValidationControllerIntegrationTest.java b/spring-web-modules/spring-mvc-xml-2/src/test/java/com/baeldung/spring/paramsvalidation/RequestAndPathVariableValidationControllerIntegrationTest.java similarity index 90% rename from spring-web-modules/spring-mvc-xml/src/test/java/com/baeldung/spring/controller/RequestAndPathVariableValidationControllerIntegrationTest.java rename to spring-web-modules/spring-mvc-xml-2/src/test/java/com/baeldung/spring/paramsvalidation/RequestAndPathVariableValidationControllerIntegrationTest.java index c4332dd879..a71a024e62 100644 --- a/spring-web-modules/spring-mvc-xml/src/test/java/com/baeldung/spring/controller/RequestAndPathVariableValidationControllerIntegrationTest.java +++ b/spring-web-modules/spring-mvc-xml-2/src/test/java/com/baeldung/spring/paramsvalidation/RequestAndPathVariableValidationControllerIntegrationTest.java @@ -1,5 +1,6 @@ -package com.baeldung.spring.controller; +package com.baeldung.spring.paramsvalidation; +import com.baeldung.spring.ClientWebConfigJava; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -11,9 +12,6 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import com.baeldung.spring.ClientWebConfig; -import com.baeldung.spring.ClientWebConfigJava; - import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -35,13 +33,13 @@ public class RequestAndPathVariableValidationControllerIntegrationTest { @Test public void getNameOfDayByNumberRequestParam_whenGetWithProperRequestParam_thenReturn200() throws Exception { mockMvc.perform(get("/public/api/1/name-for-day").param("dayOfWeek", Integer.toString(5))) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test public void getNameOfDayByNumberRequestParam_whenGetWithRequestParamOutOfRange_thenReturn400() throws Exception { mockMvc.perform(get("/public/api/1/name-for-day").param("dayOfWeek", Integer.toString(15))) - .andExpect(status().isBadRequest()); + .andExpect(status().isBadRequest()); } @Test @@ -52,7 +50,7 @@ public class RequestAndPathVariableValidationControllerIntegrationTest { @Test public void getNameOfDayByPathVariable_whenGetWithRequestParamOutOfRange_thenReturn400() throws Exception { mockMvc.perform(get("/public/api/1/name-for-day/{dayOfWeek}", Integer.toString(15))) - .andExpect(status().isBadRequest()); + .andExpect(status().isBadRequest()); } @Test @@ -63,7 +61,7 @@ public class RequestAndPathVariableValidationControllerIntegrationTest { @Test public void validStringRequestParam_whenGetWithTooLongRequestParam_thenReturn400() throws Exception { mockMvc.perform(get("/public/api/1/valid-name").param("name", "asdfghjklqw")) - .andExpect(status().isBadRequest()); + .andExpect(status().isBadRequest()); } @Test diff --git a/spring-web-modules/spring-mvc-xml/README.md b/spring-web-modules/spring-mvc-xml/README.md index 3fbea3626b..3260d91d94 100644 --- a/spring-web-modules/spring-mvc-xml/README.md +++ b/spring-web-modules/spring-mvc-xml/README.md @@ -12,12 +12,10 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Returning Image/Media Data with Spring MVC](https://www.baeldung.com/spring-mvc-image-media-data) - [Geolocation by IP in Java](https://www.baeldung.com/geolocation-by-ip-with-maxmind) - [Guide to JavaServer Pages (JSP)](https://www.baeldung.com/jsp) -- [Exploring SpringMVC’s Form Tag Library](https://www.baeldung.com/spring-mvc-form-tags) - [web.xml vs Initializer with Spring](https://www.baeldung.com/spring-xml-vs-java-config) - [A Java Web Application Without a web.xml](https://www.baeldung.com/java-web-app-without-web-xml) -- [Validating RequestParams and PathVariables in Spring](https://www.baeldung.com/spring-validate-requestparam-pathvariable) -- [Debugging the Spring MVC 404 “No mapping found for HTTP request” Error](https://www.baeldung.com/spring-mvc-404-error) - [Introduction to Servlets and Servlet Containers](https://www.baeldung.com/java-servlets-containers-intro) +- More articles: [[more -->]](../spring-mvc-xml-2) ## Spring MVC with XML Configuration Example Project diff --git a/spring-web-modules/spring-mvc-xml/pom.xml b/spring-web-modules/spring-mvc-xml/pom.xml index e67052e0cd..c814787ba7 100644 --- a/spring-web-modules/spring-mvc-xml/pom.xml +++ b/spring-web-modules/spring-mvc-xml/pom.xml @@ -39,11 +39,6 @@ ${jstl.version} runtime - - org.hibernate.validator - hibernate-validator - ${hibernate-validator.version} - com.fasterxml.jackson.core