Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

javax validation constraints not working in Spring Boot

I cannot get annotations such as @NotEmpty, @NotBlank and @NotNull to fire in my Spring Boot application.

I've followed this (maven) example:

https://spring.io/guides/gs/validating-form-input/

...and I don't see what I am doing wrong.

POJO:

import javax.validation.constraints.NotBlank;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class College
{    
    @NotBlank
    private String collegeCode;
.
.
.

Spring controller:

@RequestMapping(value="/addCollege", method = RequestMethod.POST) 
public String addCollege(@Valid @ModelAttribute("college") College college, BindingResult bindingResult, Model model, HttpSession session)
{
    if(bindingResult.hasErrors()) //this is never true
    {
        logger.debug("Errors when adding new college!!!");
        return "admin/colleges/addCollege";
    }
    collegeProcessor.saveCollege(college);
    return getAllColleges(model, session);
}

Screen:

<form action="#" th:action="${addOrEdit} == 'add' ? @{/addCollege} : @{/updateCollege}" th:object="${college}" method="post">

    <table class="table">

        <tr>
            <td>College Code</td>
            <td><input size="10" name="collegeCode" th:field="*{collegeCode}"/></td>
            <div id="errors" th:if="${#fields.hasErrors('collegeCode')}" th:errors="*{collegeCode}"></div>
        </tr>
.
.
.

As well as @NotBlank, I have tried @NotEmpty and @NotNull, but the same thing happens. My screen does not validate the input, and allows a college object with an empty collegeCode to be saved.

The interesting thing is if I change my POJO to use the deprecated Hibernate validator instead...

import org.hibernate.validator.constraints.NotBlank;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class College
{
    @NotBlank
    private String collegeCode;
.
.
.

...then the validation DOES fire, and the screen prevents me from saving a College object with an empty collegeCode.

Can anyone tell me why my validation doesn't work when using the javax.validation.constraints validators?

like image 498
jamesyreid Avatar asked Jun 10 '19 14:06

jamesyreid


People also ask

What does javax validation constraints NotNull do?

@NotNull validates that the annotated property value is not null. @AssertTrue validates that the annotated property value is true.

What is @valid Annotation in Spring boot?

The @Valid annotation ensures the validation of the whole object. Importantly, it performs the validation of the whole object graph. However, this creates issues for scenarios needing only partial validation. On the other hand, we can use @Validated for group validation, including the above partial validation.


2 Answers

Include Maven dependency for 2.3.0.RELEASE in pom.xml, however, it is not required for lower version of Spring Boot Application.

<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
<dependency>
  <groupId>javax.validation</groupId>
  <artifactId>validation-api</artifactId>
</dependency>
like image 179
ukchaudhary Avatar answered Sep 20 '22 08:09

ukchaudhary


Since version 2.3.0.RELEASE the validation starter is not included in web/webflux starters by default, you need to add it manually. More details here

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
like image 21
Goce Avatar answered Sep 22 '22 08:09

Goce