diff --git a/spring-boot-mvc/pom.xml b/spring-boot-mvc/pom.xml
index f4a1d75673..453a05d8e7 100644
--- a/spring-boot-mvc/pom.xml
+++ b/spring-boot-mvc/pom.xml
@@ -12,7 +12,7 @@
org.springframework.boot
spring-boot-starter-parent
- 2.0.2.RELEASE
+ 2.0.4.RELEASE
@@ -27,6 +27,11 @@
spring-boot-starter-test
test
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
diff --git a/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/LoginController.java b/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/LoginController.java
new file mode 100644
index 0000000000..589024c0bc
--- /dev/null
+++ b/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/LoginController.java
@@ -0,0 +1,20 @@
+package com.baeldung.springbootmvc;
+
+import javax.validation.Valid;
+
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.baeldung.springbootmvc.model.LoginForm;
+
+@RestController
+@RequestMapping("/")
+public class LoginController {
+
+ @PostMapping("loginform")
+ public String processLogin(@Valid LoginForm form) {
+ return "Success";
+
+ }
+}
diff --git a/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/SpringBootMvcApplication.java b/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/SpringBootMvcApplication.java
index c4213af0a3..df8f72f500 100644
--- a/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/SpringBootMvcApplication.java
+++ b/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/SpringBootMvcApplication.java
@@ -2,12 +2,11 @@ package com.baeldung.springbootmvc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@SpringBootApplication
public class SpringBootMvcApplication {
- public static void main(String[] args) {
- SpringApplication.run(SpringBootMvcApplication.class, args);
- }
+ public static void main(String[] args) {
+ SpringApplication.run(SpringBootMvcApplication.class, args);
+ }
}
diff --git a/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/config/CustomMessageSourceConfiguration.java b/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/config/CustomMessageSourceConfiguration.java
new file mode 100644
index 0000000000..e83f15a366
--- /dev/null
+++ b/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/config/CustomMessageSourceConfiguration.java
@@ -0,0 +1,27 @@
+package com.baeldung.springbootmvc.config;
+
+import org.springframework.context.MessageSource;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.support.ReloadableResourceBundleMessageSource;
+import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
+
+@Configuration
+public class CustomMessageSourceConfiguration {
+
+ @Bean
+ public MessageSource messageSource() {
+ ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
+ messageSource.setBasename("classpath:messages");
+ messageSource.setDefaultEncoding("UTF-8");
+ return messageSource;
+ }
+
+ @Bean
+ public LocalValidatorFactoryBean getValidator() {
+ LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
+ bean.setValidationMessageSource(messageSource());
+ return bean;
+ }
+
+}
diff --git a/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/config/FaviconConfiguration.java b/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/config/FaviconConfiguration.java
index 1ee13ccec2..9a1f47b5cb 100644
--- a/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/config/FaviconConfiguration.java
+++ b/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/config/FaviconConfiguration.java
@@ -32,12 +32,13 @@ public class FaviconConfiguration {
requestHandler.setLocations(locations);
return requestHandler;
}
-
- //@Controller
+
+ // @Controller
static class FaviconController {
-
- @RequestMapping(value="favicon.ico", method=RequestMethod.GET)
+
+ @RequestMapping(value = "favicon.ico", method = RequestMethod.GET)
@ResponseBody
- void favicon() {}
+ void favicon() {
+ }
}
}
diff --git a/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/model/LoginForm.java b/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/model/LoginForm.java
new file mode 100644
index 0000000000..107cd1bbf1
--- /dev/null
+++ b/spring-boot-mvc/src/main/java/com/baeldung/springbootmvc/model/LoginForm.java
@@ -0,0 +1,32 @@
+package com.baeldung.springbootmvc.model;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+public class LoginForm {
+
+ @NotEmpty(message = "{email.notempty}")
+ @Email
+ private String email;
+
+ @NotNull
+ private String password;
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+}
diff --git a/spring-boot-mvc/src/main/resources/messages.properties b/spring-boot-mvc/src/main/resources/messages.properties
new file mode 100644
index 0000000000..9794c89651
--- /dev/null
+++ b/spring-boot-mvc/src/main/resources/messages.properties
@@ -0,0 +1 @@
+email.notempty=Please provide valid email id.
\ No newline at end of file
diff --git a/spring-boot-mvc/src/main/resources/messages_fr.properties b/spring-boot-mvc/src/main/resources/messages_fr.properties
new file mode 100644
index 0000000000..070f4e0bfc
--- /dev/null
+++ b/spring-boot-mvc/src/main/resources/messages_fr.properties
@@ -0,0 +1 @@
+email.notempty=Veuillez fournir un identifiant de messagerie valide.
\ No newline at end of file
diff --git a/spring-boot-mvc/src/test/java/com/baeldung/springbootmvc/LoginControllerUnitTest.java b/spring-boot-mvc/src/test/java/com/baeldung/springbootmvc/LoginControllerUnitTest.java
new file mode 100644
index 0000000000..68229f459c
--- /dev/null
+++ b/spring-boot-mvc/src/test/java/com/baeldung/springbootmvc/LoginControllerUnitTest.java
@@ -0,0 +1,35 @@
+package com.baeldung.springbootmvc;
+
+import org.junit.Assert;
+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.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.MvcResult;
+import org.springframework.test.web.servlet.RequestBuilder;
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+
+import com.baeldung.springbootmvc.config.CustomMessageSourceConfiguration;
+
+@RunWith(SpringRunner.class)
+@WebMvcTest(value = LoginController.class, secure = false)
+@ContextConfiguration(classes = { SpringBootMvcApplication.class, CustomMessageSourceConfiguration.class })
+public class LoginControllerUnitTest {
+
+ @Autowired
+ private MockMvc mockMvc;
+
+ @Test
+ public void givenLoginForm_whenEmailFieldNotProvided_testCustomValidMessageIsReturned() throws Exception {
+
+ RequestBuilder builder = MockMvcRequestBuilders.post("/loginform").param("email", "").param("password", "helo");
+
+ // header("accept-language", "fr").
+ MvcResult perform = mockMvc.perform(builder).andReturn();
+ Assert.assertTrue(perform.getResolvedException().getMessage().contains("valid email"));
+
+ }
+}
\ No newline at end of file