From f7314ca09e9a2bb24e267fb7faacb656fe884e90 Mon Sep 17 00:00:00 2001 From: freelansam <79205526+freelansam@users.noreply.github.com> Date: Wed, 14 Apr 2021 01:25:33 +0530 Subject: [PATCH] BAEL-4223: Displaying Spring error messages with Thymeleaf (#10652) --- spring-web-modules/spring-thymeleaf-3/pom.xml | 10 ++- .../com/baeldung/thymeleaf/errors/User.java | 82 +++++++++++++++++++ .../thymeleaf/errors/UserController.java | 46 +++++++++++ .../thymeleaf/errors/UserRepository.java | 8 ++ .../errors/UserValidationService.java | 22 +++++ .../src/main/resources/application.properties | 6 ++ .../resources/templates/errors/addUser.html | 77 +++++++++++++++++ .../main/resources/templates/errors/home.html | 34 ++++++++ 8 files changed, 284 insertions(+), 1 deletion(-) create mode 100644 spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/User.java create mode 100644 spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/UserController.java create mode 100644 spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/UserRepository.java create mode 100644 spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/UserValidationService.java create mode 100644 spring-web-modules/spring-thymeleaf-3/src/main/resources/application.properties create mode 100644 spring-web-modules/spring-thymeleaf-3/src/main/resources/templates/errors/addUser.html create mode 100644 spring-web-modules/spring-thymeleaf-3/src/main/resources/templates/errors/home.html diff --git a/spring-web-modules/spring-thymeleaf-3/pom.xml b/spring-web-modules/spring-thymeleaf-3/pom.xml index 6dd1267e8a..6a46dca117 100644 --- a/spring-web-modules/spring-thymeleaf-3/pom.xml +++ b/spring-web-modules/spring-thymeleaf-3/pom.xml @@ -26,7 +26,15 @@ org.springframework.boot spring-boot-starter-thymeleaf - + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.h2database + h2 + runtime + org.springframework.boot spring-boot-starter-test diff --git a/spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/User.java b/spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/User.java new file mode 100644 index 0000000000..a6923287af --- /dev/null +++ b/spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/User.java @@ -0,0 +1,82 @@ +package com.baeldung.thymeleaf.errors; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +@Entity +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @NotEmpty(message = "User's name cannot be empty.") + @Size(min = 5, max = 250) + private String fullName; + + @NotEmpty(message = "User's email cannot be empty.") + @Size(min = 7, max = 320) + private String email; + + @NotNull(message = "User's age cannot be null.") + @Min(value = 18) + private Integer age; + + private String country; + + private String phoneNumber; + + public Long getId() { + return id; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(String phoneNumber) { + this.phoneNumber = phoneNumber; + } + + public void setId(Long id) { + this.id = id; + } + + public String getFullName() { + return fullName; + } + + public void setFullName(String fullName) { + this.fullName = fullName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } +} diff --git a/spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/UserController.java b/spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/UserController.java new file mode 100644 index 0000000000..92e67dc6a8 --- /dev/null +++ b/spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/UserController.java @@ -0,0 +1,46 @@ +package com.baeldung.thymeleaf.errors; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.validation.ObjectError; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; + +@Controller +public class UserController { + + @Autowired + private UserRepository repository; + + @Autowired + private UserValidationService validationService; + + @GetMapping("/add") + public String showAddUserForm(User user) { + return "errors/addUser"; + } + + @PostMapping("/add") + public String addUser(@Valid User user, BindingResult result, Model model) { + + String err = validationService.validateUser(user); + + if (!err.isEmpty()) { + ObjectError error = new ObjectError("globalError", err); + result.addError(error); + } + + if (result.hasErrors()) { + return "errors/addUser"; + } + + repository.save(user); + model.addAttribute("users", repository.findAll()); + return "errors/home"; + } + +} diff --git a/spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/UserRepository.java b/spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/UserRepository.java new file mode 100644 index 0000000000..5e0e322728 --- /dev/null +++ b/spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/UserRepository.java @@ -0,0 +1,8 @@ +package com.baeldung.thymeleaf.errors; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface UserRepository extends JpaRepository { +} diff --git a/spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/UserValidationService.java b/spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/UserValidationService.java new file mode 100644 index 0000000000..a2de4e2ed4 --- /dev/null +++ b/spring-web-modules/spring-thymeleaf-3/src/main/java/com/baeldung/thymeleaf/errors/UserValidationService.java @@ -0,0 +1,22 @@ +package com.baeldung.thymeleaf.errors; + +import org.springframework.stereotype.Service; + +@Service +public class UserValidationService { + + public String validateUser(User user) { + + String message = ""; + + if (user.getCountry() != null && user.getPhoneNumber() != null) { + if (user.getCountry() + .equalsIgnoreCase("India") + && !user.getPhoneNumber() + .startsWith("91")) { + message = "Phone number is invalid for " + user.getCountry(); + } + } + return message; + } +} diff --git a/spring-web-modules/spring-thymeleaf-3/src/main/resources/application.properties b/spring-web-modules/spring-thymeleaf-3/src/main/resources/application.properties new file mode 100644 index 0000000000..75770808da --- /dev/null +++ b/spring-web-modules/spring-thymeleaf-3/src/main/resources/application.properties @@ -0,0 +1,6 @@ +spring.datasource.url=jdbc:h2:mem:testdb +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password=password +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect +spring.main.allow-bean-definition-overriding=true \ No newline at end of file diff --git a/spring-web-modules/spring-thymeleaf-3/src/main/resources/templates/errors/addUser.html b/spring-web-modules/spring-thymeleaf-3/src/main/resources/templates/errors/addUser.html new file mode 100644 index 0000000000..4e37dc45ce --- /dev/null +++ b/spring-web-modules/spring-thymeleaf-3/src/main/resources/templates/errors/addUser.html @@ -0,0 +1,77 @@ + + + + + + +Displaying Error Messages with Thymeleaf + + +
+
+

Add a Record

+
+
+ +
    +
  • +
+
+
+ +

+

+
+ +

Invalid Age

+
+
+ +

+

+
+ +

+

+
+

Global errors:

+

+

+

All errors in place:

+
+
    +
  • +
+
+ +
+

This is outside the form:

+

Errors on a single field:

+
+

All errors:

+
    +
  • +
+
+
+ + \ No newline at end of file diff --git a/spring-web-modules/spring-thymeleaf-3/src/main/resources/templates/errors/home.html b/spring-web-modules/spring-thymeleaf-3/src/main/resources/templates/errors/home.html new file mode 100644 index 0000000000..4f63be5dc6 --- /dev/null +++ b/spring-web-modules/spring-thymeleaf-3/src/main/resources/templates/errors/home.html @@ -0,0 +1,34 @@ + + + + + +Displaying Error Messages with Thymeleaf + + +
+
+

Users

+ + + + + + + + + + + +
IDFull nameEmailAgeCountryPhone Number
+ + + + + +
+
+
+ + \ No newline at end of file