1 hibernate validator 官方文檔:https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/
在 springboot 項目中 spring-boot-starter-web 已經包含了 hibernate-validator 可以直接使用。否則需要在 maven 依賴中添加依賴項。
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator-modules</artifactId> <version>6.0.13.Final</version> </dependency>
2 對請求的參數進行校驗
import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import javax.validation.Valid; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.util.List; @Data @AllArgsConstructor @NoArgsConstructor @Builder public class RequestParamBase { @NotBlank(message = "name 不能為空") private String name; @NotEmpty(message = "fruits 不能為空") @Valid private List<Fruit> fruits; } import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @AllArgsConstructor @NoArgsConstructor @Data public class Fruit { @NotBlank(message = "color 不能為空") private String color; @NotNull(message = "price 不能為空") private Integer price; }
說明:對於對象級聯驗證,需要在對象字段上添加 @Valid 標記。
3 在 controller 方法上使用驗證
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid; @RequestMapping(value = "/student/1", method = RequestMethod.POST) public Response getStudent(@RequestBody @Valid RequestParamBase paramBase, BindingResult validResult) { if (validResult.hasErrors()) { for(ObjectError error : validResult.getAllErrors()) { System.out.println(error.getDefaultMessage()); } return null; } System.out.println(paramBase); Response result = Response.builder().age(23).name("well").build(); return result; }
此時會發現會對所有字段驗證,如果想驗證出第一條問題趕快退出,就需要添加配置。
通常按順序驗證到第一個字段不符合驗證要求時,就可以直接拒絕請求了。Hibernate Validator有以下兩種驗證模式:
普通模式(會校驗完所有的屬性,然后返回所有的驗證失敗信息)
快速失敗返回模式(只要有一個驗證失敗,則返回)
4 配置快速失敗
failFast:true 快速失敗返回模式 false 普通模式
ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
.configure()
.failFast( true )
.buildValidatorFactory();
Validator validator = validatorFactory.getValidator();
和 (hibernate.validator.fail_fast:true 快速失敗返回模式 false 普通模式)
ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
.configure()
.addProperty( "hibernate.validator.fail_fast", "true" )
.buildValidatorFactory();
Validator validator = validatorFactory.getValidator();
在 springboot 項目中配置
import org.hibernate.validator.HibernateValidator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; @Configuration public class ValidConfig { @Bean public Validator validator() { ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class) .configure() .addProperty("hibernate.validator.fail_fast", "true") .buildValidatorFactory(); Validator validator = validatorFactory.getValidator(); return validator; } }
5 如果在 controller 中有多個入參,可以按照以下方式進行配置
public void test()(@RequestBody @Valid DemoModel demo, BindingResult result,@RequestBody @Valid DemoModel demo2, BindingResult result2)
參考文獻:https://www.cnblogs.com/mr-yang-localhost/p/7812038.html