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
+
+
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
+
+
+ | ID |
+ Full name |
+ Email |
+ Age |
+ Country |
+ Phone Number |
+
+
+ |
+ |
+ |
+ |
+ |
+ |
+
+
+
+
+
+
\ No newline at end of file