Main Tutorials

Spring REST API Validation

In Spring MVC, just annotate a @Valid on the @RequestBody to fire the validation process.

Note
For complete source code, please refer to this – Spring Boot Ajax example

P.S Tested with Spring Boot 1.5.1.RELEASE (Spring 4.3.6.RELEASE)

1. JSR 303 Validation

Add JSR303 annotations on a bean.


package com.mkyong.model;

import org.hibernate.validator.constraints.NotBlank;

public class SearchCriteria {

    @NotBlank(message = "username can't empty!")
    String username;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}

2. @Valid @RequestBody

A Spring REST API, the second argument Errors object will contains the validation detail.


package com.mkyong.controller;

import com.mkyong.model.AjaxResponseBody;
import com.mkyong.model.SearchCriteria;
import com.mkyong.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.util.List;
import java.util.stream.Collectors;

@RestController
public class SearchController {

    @PostMapping("/api/search")
    public ResponseEntity<?> search(
		@Valid @RequestBody SearchCriteria search, Errors errors) {

        Result result = new Result();

        //If error, just return a 400 bad request, along with the error message
        if (errors.hasErrors()) {

			// get all errors 
            result.setMsg(errors.getAllErrors()
				.stream()
				.map(x -> x.getDefaultMessage())
				.collect(Collectors.joining(",")));
				
            return ResponseEntity.badRequest().body(result);

        }

        List<User> users = //get users...
        if (users.isEmpty()) {
            result.setMsg("no user found!");
        } else {
            result.setMsg("success");
        }
        result.setResult(users);

        return ResponseEntity.ok(result);

    }

}

References

  1. JSR 303: Bean Validation
  2. Spring Boot Ajax example

About Author

author image
Founder of Mkyong.com, love Java and open source stuff. Follow him on Twitter. If you like my tutorials, consider make a donation to these charities.

Comments

Subscribe
Notify of
4 Comments
Most Voted
Newest Oldest
Inline Feedbacks
View all comments
Koshish Rijal
5 years ago

errors.hasError() doesnot catch the error for extra fileld of an object in the Request object when doing update

Amit
7 years ago

What is the Result class?

Guest
6 years ago
Reply to  Amit

Appears to be a bad copy/paste from the AjaxResponseBody in this example: https://mkyong.com/spring-boot/spring-boot-ajax-example/

nari
4 years ago

how can i validate the data type in reques body
ex. In DTO i have carType which integer, but the submitted carType in request body is String