spring-boot-starter-validation ignoring the restrictions

46 Views Asked by At

I'm trying to apply validations to my Spring Boot project but they're not being applied. I'm trying to display an error message below the text area indicating the error that's occurring in the form. However, when I fill out the form, it completely ignores my restrictions.

Attached code: My object's looks like this:

package com.erphotel.personManagement.domain;
import jakarta.persistence.\*;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import java.io.Serializable;
import lombok.Data;
@Data
@Entity
@Table(name = "persons")
public class PersonDomain implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long person_id;
@NotBlank(message = "El nombre es obligatorio")
private String name;
@NotNull(message = "El apellido es obligatorio")
private String surname;
@Pattern(regexp = "^\[0-9\]{9}$", message = "Por favor, introduce un número de teléfono válido (9 dígitos)")
private String phone_number;
@Pattern(regexp = "^\[0-9\]{8}\[A-Za-z\]$", message = "Por favor, introduce un DNI válido (8 dígitos y 1 letra)")
private String dni;
}

My controller's action looks like this:

@PostMapping("/savePersona")
    public String guardarPersona(@Valid @ModelAttribute("persona") PersonDomain persona, @AuthenticationPrincipal User username,
             BindingResult result) {
        if (result.hasErrors()) {
            return "redirect:/newPerson";
        }
        personService.salvar(persona);
        return "redirect:/person";
    }

My HTML looks like this:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">

    <head>
        <meta charset="UTF-8">
        <title>CodePen - Basic hotel booking form</title>
        <link rel="stylesheet" href="https://netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css">
        <link href='https://fonts.googleapis.com/css?family=Lato:300,400' rel='stylesheet' type='text/css'>
        <link rel="stylesheet" href="/booking/style.css">
    </head>
    <body>

        <form th:action="@{/savePersona}" th:object="${persona}" method="POST">

            <!--  General -->
            <h2 class="heading">Añadir Persona</h2>
            <div class="form-group">
                <div class="grid">
                    <div class="col-1-2">
                        <div class="controls">
                            <input type="text" id="name" class="floatLabel" name="name" th:field="*{name}">
                            <label for="name">Nombre</label>
                            <small class="form-text text-danger" th:if="${#fields.hasErrors('name')}" th:errors="*{name}"></small>
                        </div>
                    </div>
                    <div class="col-1-2">
                        <div class="controls">
                            <input type="text" id="surname" class="floatLabel" name="surname" th:field="*{surname}">
                            <label for="surname">Apellidos</label>
                            <small class="form-text text-danger" th:if="${#fields.hasErrors('surname')}" th:errors="*{surname}"></small>
                        </div>
                    </div>
                </div>
                <div class="controls">
                    <input type="tel" id="phone" class="floatLabel" name="phone" th:field="*{phone_number}" >
                    <label for="phone">Teléfono</label>
                    <small class="form-text text-danger" th:if="${#fields.hasErrors('phone_number')}" th:errors="*{phone_number}"></small>
                </div>
                <div class="controls">
                    <input type="text" id="dni" class="floatLabel" name="dni" th:field="*{dni}">
                    <label for="dni">DNI</label>
                    <small class="form-text text-danger" th:if="${#fields.hasErrors('dni')}" th:errors="*{dni}"></small>
                </div>
                <div class="controls">               
                    <button type="submit" value="Submit" style="color:white">Finalizar</button>
                </div>
            </div>

            <!-- partial -->
            <script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>
            <script src='https://raw.githubusercontent.com/andiio/selectToAutocomplete/master/jquery-ui-autocomplete.js'></script>
            <script
            src='https://raw.githubusercontent.com/andiio/selectToAutocomplete/master/jquery.select-to-autocomplete.js'></script>
            <script
            src='https://raw.githubusercontent.com/andiio/selectToAutocomplete/master/jquery.select-to-autocomplete.min.js'></script>
            <script src="/booking/script.js"></script>
        </form>
    </body>

</html>

My POM looks like this:

<dependency>
      <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-validation</artifactId>
  </dependency>

ERROR LOG:

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Fri Apr 14 12:28:18 CEST 2023
There was an unexpected error (type=Bad Request, status=400).
Validation failed for object='persona'. Error count: 3
org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 3 errors
Field error in object 'persona' on field 'name': rejected value []; codes [NotBlank.persona.name,NotBlank.name,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [persona.name,name]; arguments []; default message [name]]; default message [El nombre es obligatorio]
Field error in object 'persona' on field 'phone_number': rejected value []; codes [Pattern.persona.phone_number,Pattern.phone_number,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [persona.phone_number,phone_number]; arguments []; default message [phone_number],[Ljakarta.validation.constraints.Pattern$Flag;@47bb41ff,^[0-9]{9}$]; default message [Por favor, introduce un número de teléfono válido (9 dígitos)]
Field error in object 'persona' on field 'dni': rejected value []; codes [Pattern.persona.dni,Pattern.dni,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [persona.dni,dni]; arguments []; default message [dni],[Ljakarta.validation.constraints.Pattern$Flag;@47bb41ff,^[0-9]{8}[A-Za-z]$]; default message [Por favor, introduce un DNI válido (8 dígitos y 1 letra)]
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:177)
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:181)

I have searched a few pages and most of them indicate that the errors are related to the POM, but I have it updated and it still doesn't work. I have also tried some code from internet pages and nothing works. Previously, I had this done with a script, but I prefer to do it with validation and I would like to know where my error is.

Thanks in advance.

0

There are 0 best solutions below