自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Spring Boot下如何校驗(yàn)Spring MVC的請求參數(shù)及如何自定義校驗(yàn)注解

開發(fā) 后端
Spring Boot提供了spring-boot-starter-validation 為Bean的校驗(yàn)提供支持。我們可以通過一系列的校驗(yàn)注解對Java Bean的屬性進(jìn)行校驗(yàn)。

在Java世界里,用于Java Bean的校驗(yàn)的標(biāo)準(zhǔn)規(guī)范是JSR 380,又被稱作Bean Validation 2.0。而JSR 380的實(shí)現(xiàn)是Hibernate Validator。

Spring Boot提供了spring-boot-starter-validation 為Bean的校驗(yàn)提供支持。我們可以通過一系列的校驗(yàn)注解對Java Bean的屬性進(jìn)行校驗(yàn)。

本文將演示如何在對Spring MVC的請求參數(shù)進(jìn)行校驗(yàn)。當(dāng)然它可以用在任何Java Bean的校驗(yàn)上。

我們先新建一個演示項(xiàng)目,注意除了添加“Spring Web”依賴,還需要額外添加“Validation”依賴,從Spring Boot 2.3后,我們需要顯示添加此依賴。

常用JSR 380注解及如何校驗(yàn)請求DTO

@Data
public class PersonDto {
@NotNull(message = "姓名不能為空")
private String name;
@Min(value = 18, message = "年紀(jì)最小18")
@Max(value = 60, message = "年紀(jì)最大60")
private Integer age;
@Email(message = "地址只能郵件")
private String email;
}

在DTO這個JavaBean上使用JSR 380注解,主要的注解有:

  • @NotNull :校驗(yàn)注解的屬性不能為null
  • @AssertTrue : 校驗(yàn)注解的屬性是true
  • @Size : 校驗(yàn)大小范圍是在min和max之間,可以是String、Collection、Map,和數(shù)組屬性
  • @Min: 校驗(yàn)注解的屬性最小不能小于設(shè)定的值
  • @Max: 校驗(yàn)注解的屬性最大不能大于設(shè)定的值
  • @Pattern:校驗(yàn)當(dāng)前字符串屬性符合指定的正則表達(dá)式
  • @Email :校驗(yàn)注解屬性是一個有效的郵件地址
  • @NotEmpty:校驗(yàn)注解的屬性不能為null或者是empty,以是String、Collection、Map,和數(shù)組屬性
  • @NotBlank: 校驗(yàn)文本屬性不為null或者空格
  • @Positive 和 @PositiveOrZero :校驗(yàn)整數(shù)是正數(shù)/正數(shù)或0
  • @Negative 和 @NegativeOrZero :校驗(yàn)整數(shù)是負(fù)數(shù)/負(fù)數(shù)或0
  • @Past and @PastOrPresent :校驗(yàn)日期是過去/過去或現(xiàn)在
  • @Future and @FutureOrPresent :校驗(yàn)日期是未來/未來或現(xiàn)在

注意上面的“message”中設(shè)置提示錯誤的信息。

控制器如何生效及如何校驗(yàn)請求參數(shù)

@RestController
@RequestMapping("/people")
@Validated //2
public class PersonController {

@PostMapping
public String save(@Valid @RequestBody PersonDto personDto){ //1
return "OK";
}

@GetMapping("/findByAge") //2
public String findByAge(@Range(min = 18,max = 60, message = "年紀(jì)只能是18到60之間") Integer age){
return "OK";
}
}

1、校驗(yàn)DTO,只需要在@RequestBody前加上注解“@Valid”,若出現(xiàn)校驗(yàn)錯誤,拋出MethodArgumentNotValidException

2、檢驗(yàn)請求中的參數(shù)(包括路徑變量),我們需要在類上注解“@Validated”才會生效,若出現(xiàn)校驗(yàn)錯誤,拋出ConstraintViolationException。此處的@Range注解來自于Hibernate Validator,非標(biāo)準(zhǔn)JSR 380注解。

全局異常處理,給前端友好的校驗(yàn)提示

當(dāng)出現(xiàn)校驗(yàn)錯誤時,Spring Boot只會拋出異常,所以為了讓前端更友好的處理這些異常,我們將對這些拋出的異常做出處理。

@RestControllerAdvice
public class CustomExceptionHandler {

@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public Map<String, String> validationExceptionHandler(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;
}

@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(ConstraintViolationException.class)
public String validationExceptionHandler(ConstraintViolationException ex) {

return ex.getMessage();
}
}

驗(yàn)證效果

運(yùn)行應(yīng)用,并違反校驗(yàn)規(guī)則,如圖:

如何自定義檢驗(yàn)注解

上面我們使用了JSR 380以及Hibernate的注解來校驗(yàn),這節(jié)我們演示如何自定義校驗(yàn)注解。

我們通過定義個校驗(yàn)注解“@Enumeration”和在“EnumerationValidator”類中定義校驗(yàn)規(guī)則。

當(dāng)前例子演示功能為:只能是枚舉里允許的值,否則校驗(yàn)不通過。

  • 注解定義

@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = EnumerationValidator.class) //3
public @interface Enumeration {
String message() default "屬性只能從列表中來"; //1
String[] values(); //2
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}

1、message屬性定義錯誤信息

2、values設(shè)置可選的枚舉值

3、通過“@Constraint”指定校驗(yàn)的類

注意:若沒有g(shù)roups()和payload(),會報:javax.validation.constraintdefinitionexception: hv000074

  • 校驗(yàn)邏輯類

public class EnumerationValidator implements ConstraintValidator<Enumeration,String> {
private String message;
private List<String> allowable;
@Override
public void initialize(Enumeration enumeration){
this.message = enumeration.message();
this.allowable = Arrays.asList(enumeration.values());
}

@Override
public boolean isValid(String value, ConstraintValidatorContext context){
return this.allowable.contains(value);
}
}

這里的邏輯很簡單,只需要可選的枚舉值包含被校驗(yàn)的值即可。

  • 控制器中,當(dāng)然也配合了類上注解的“@Validated”

@GetMapping("/findByGender")
public String findByGender(@Enumeration(values = {"男","女"}, message = "性別只能是男或女") String gender){
return "OK";
}

啟動驗(yàn)證結(jié)果:

感謝對我的書《從企業(yè)級開發(fā)到云原生微服務(wù):Spring Boot實(shí)戰(zhàn)》的支持。

參考資料:

https://medium.com/codex/spring-boot-create-custom-annotation-to-validate-request-parameter-dcf483539d90

https://www.baeldung.com/spring-boot-bean-validation

https://reflectoring.io/bean-validation-with-spring-boot/

文章出自:??愛科學(xué)的衛(wèi)斯理??,如有轉(zhuǎn)載本文請聯(lián)系愛科學(xué)的衛(wèi)斯理今日頭條號。

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2024-10-14 17:18:27

2021-08-10 15:11:27

Spring Boot參數(shù)校驗(yàn)

2021-08-12 10:32:50

Spring Boot參數(shù)校驗(yàn)分組校驗(yàn)

2023-12-04 07:27:54

SpringMVC方法

2025-03-10 01:00:00

Spring參數(shù)解析器

2025-03-13 07:33:46

Spring項(xiàng)目開發(fā)

2021-08-13 08:36:15

SpringMVC自定義

2022-03-07 07:33:24

Spring自定義機(jī)制線程池

2022-06-28 14:57:09

FormatterSpring

2017-08-03 17:00:54

Springmvc任務(wù)執(zhí)行器

2020-11-25 11:20:44

Spring注解Java

2018-07-06 15:58:34

SpringSchemaJava

2023-10-07 14:49:45

2022-06-27 08:16:34

JSON格式序列化

2023-09-19 22:41:30

控制器HTTP

2023-10-23 08:18:50

掃描SpringBean

2021-10-22 14:50:23

Spring BootJava

2016-08-23 13:21:15

MVC路由視圖

2023-03-09 12:04:38

Spring文件校驗(yàn)

2025-02-12 08:57:43

Spring動態(tài)注冊組件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號