Spring Validation

https://github.com/spring-boot-tutorials/spring-validation

In this article we will configure Spring Validation.

Create Initial Code Base

  • Go to https://start.spring.io/

  • Add the following dependencies:

    • spring-boot-starter-validation

    • spring-boot-starter-web

    • lombok

  • Click Generate

Dependencies

Dependencies in pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

Model

Create new POJO class src/main/java/com/example/spring_validation/User.java:

@Data
@SuperBuilder
@NoArgsConstructor
public class User {

    private long id;

    @NotBlank(message = "Name is mandatory")
    private String name;

    @NotBlank(message = "Email is mandatory")
    private String email;
}

Service

Create new file src/main/java/com/example/spring_validation/UserService.java:

@Service
@Validated
public class UserService {

    public void validateUserViaAnnotation(@Valid User user) {
        System.out.println("Bean is valid");
    }

    @Autowired
    Validator validator;

    public void validateUserProgrammatically(User user) {
        Set<ConstraintViolation<User>> violations = validator.validate(user);

        if (!violations.isEmpty()) {
            for (ConstraintViolation<User> violation : violations) {
                System.out.println("Validation error: " + violation.getMessage());
            }
        } else {
            System.out.println("Bean is valid.");
        }
    }
}

Controller

Let’s create a new file src/main/java/com/example/spring_validation/UserController.java

@RestController
public class UserController {

    @PostMapping("/users")
    String addUser(@Valid @RequestBody User user) {
        return "User is valid";
    }

    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Map<String, String> handleValidationExceptions(MethodArgumentNotValidException ex) {
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getAllErrors().forEach((error) -> {
            String fieldName = ((FieldError) error).getField();
            String errorMessage = error.getDefaultMessage();
            errors.put(fieldName, errorMessage);
        });
        return errors;
    }
}

Main

Modify MainApplication.java:

@SpringBootApplication
public class SpringValidationApplication implements CommandLineRunner {
    @Autowired
    UserService userService;

    public static void main(String[] args) {
            SpringApplication.run(SpringValidationApplication.class, args);
    }

    public void run(String... args) throws Exception {
            try {
                    this.userService.validateUserViaAnnotation(User.builder().name("Marcus Chiu").build());
            } catch (ConstraintViolationException e) {
                    Set<ConstraintViolation<?>> violations = e.getConstraintViolations();
                    if (!violations.isEmpty()) {
                            for(ConstraintViolation violation : violations) {
                                    System.out.println("Validation error: " + violation.getMessage());
                            }
                    } else {
                            System.out.println("Bean is valid.");
                    }
            }

            this.userService.validateUserProgrammatically(User.builder().name("Marcus Chiu").build());
    }
}

Run Application

mvn spring-boot:run

Verify output console is correct