引入依賴(lài)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<version>2.0.1</version>
</dependency>
常用校驗(yàn)注解
@Null(groups={Add.class}) 參數(shù)必須為null,group設(shè)置分組,默認(rèn)為default
@NotNull 參數(shù)不為null
@NotEmpty 參數(shù)不為null 且不為空集合,集合不為空
@NotBlank 參數(shù)不為null且不為空串,只能作用字符串類(lèi)型
@AssertFalse 被注釋的元素必須是false
@AssertTrue 被注釋的元素必須是true
@Min(value) 被注釋的元素必須為一個(gè)數(shù)字 >=
@Max(value) 被注釋的元素必須為一個(gè)數(shù)字 <=
@DecimalMin(“value”) >=
@DecimalMax(“value”) <=
@NegativeOrZero <=0
@Range(min,max) 被注釋的元素大小必須在指定的范圍內(nèi)
@Size(min ,max) 被注釋的元素大小必須在指定的范圍內(nèi)
@Email 被注釋的元素必須是電子郵箱地址
@Past 被注釋的元素必須是一個(gè)過(guò)去的日期
@PastOrPresent 被注釋的元素必須是一個(gè)過(guò)去的時(shí)間
@Future 被注釋的元素必須是一個(gè)將來(lái)的日期
@Pattern(regexp = “1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$”) 被注釋的元素必須是符合指定的正則表達(dá)式
@URL 被注釋的元素必須是鏈接地址
提示:除了@NotNull注解之外,其他參數(shù)校驗(yàn)注解只有參數(shù)不為空的時(shí)候才生效
一般校驗(yàn)注解都有一個(gè)message的屬性,這個(gè)屬性代表的是注解校驗(yàn)不通過(guò)時(shí)返回的錯(cuò)誤提示。
在controller層方法參數(shù)使用校驗(yàn)注解
- 首先需要在controller類(lèi)上面加上@Validated注解。
- 在參數(shù)前面加上校驗(yàn)注解。如@NotBlank(message = “名字不能為空”) String name
上述注解的包:
org.springframework.validation.annotation.Validated;
javax.validation.constraints.NotBlank;
注解參數(shù):message,當(dāng)不滿(mǎn)足校驗(yàn)條件的時(shí)候會(huì)拋出ConstraintViolationException異常,異常中會(huì)包含該message對(duì)應(yīng)的內(nèi)容----名字不能為空。
import org.springframework.validation.annotation.Validated;
import java.util.*;
@RestController
@Validated
public class TestController extends JeecgController<Test, TestService> {
@PostMapping(value = "/test")
Result<?> test(@RequestBody @NotBlank(message = "名字不能為空") String name,
@NotNull(message = "年齡不能為空") @Max(value = 30,message = "最大不能超過(guò)30") @Min(value = 18,message = "最小不能小于18") Integer age) {
return null;
}
}
效果(已處理)
在controller層的DTO對(duì)象使用校驗(yàn)注解
- 首先需要在controller類(lèi)上面加上@Validated注解。
- 在對(duì)象參數(shù)前面加上@Valid注解,并在對(duì)象內(nèi)使用校驗(yàn)注解
- 如果對(duì)象參數(shù)內(nèi)部還嵌套這其他對(duì)象,需要在對(duì)象屬性上面加上@Valid注解(這條和第二條原理差不多)
不滿(mǎn)足對(duì)象內(nèi)的校驗(yàn)時(shí),會(huì)拋出MethodArgumentNotValidException異常
上述注解的包:
org.springframework.validation.annotation.Validated;
javax.validation.Valid;
import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;
import java.util.*;
@RestController
@Validated
public class TestController extends JeecgController<Test, TestService> {
@PostMapping(value = "/test")
Result<?> test(@RequestBody @Valid TestDTO testDTO) {
return testService.test(testDTO);
}
}
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;
@Data
@ApiModel(value = "testDTO")
public class TestDTO {
@ApiModelProperty(value = "用戶(hù)id",required = true)
@NotBlank(message = "用戶(hù)id不能為空")
private String userId;
@ApiModelProperty(value = "訂單id列表",required = true)
@Size(min = 1, message = "至少要選擇一個(gè)訂單")
private List<String> orderIdList;
@ApiModelProperty(value = "是否通知顧客",required = true)
@NotNull(message = "是否通知顧客不能為空")
private Boolean notifyCustomer;
}
效果(已處理)
校驗(yàn)失敗返回
一般來(lái)說(shuō),項(xiàng)目都會(huì)定好響應(yīng)體的結(jié)構(gòu),直接拋異常返回的信息和預(yù)期不太符合。
這個(gè)時(shí)候就需要我們來(lái)全局精準(zhǔn)捕獲該異常并處理異常信息,按照符合標(biāo)準(zhǔn)的方式返回。
當(dāng)請(qǐng)求是GET請(qǐng)求,并且使用DTO對(duì)象接收參數(shù)時(shí),使用方式和POST請(qǐng)求使用DTO對(duì)象用法一樣,但是校驗(yàn)不通過(guò)的異常不一樣。GET請(qǐng)求拋出的異常是BindException。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-653433.html
@RestControllerAdvice
@Slf4j
public class ExceptionHandler {
/**
* 這個(gè)異常在校驗(yàn)不通過(guò)的時(shí)候就會(huì)拋出
*
* @param e
* @return: Result<?>
**/
@ExceptionHandler({MethodArgumentNotValidException.class, ConstraintViolationException.class, BindException.class})
public Result<?> handleMethodArgumentNotValidException(Exception e) {
log.info("全局捕獲校驗(yàn)注解異常e={}", e.getMessage());
Result<?> res = Result.ok();
if (e instanceof MethodArgumentNotValidException) {
MethodArgumentNotValidException notValidException = (MethodArgumentNotValidException) e;
BindingResult bindingResult = notValidException.getBindingResult();
List<FieldError> fieldErrorList = bindingResult.getFieldErrors();
String msg = fieldErrorList.stream().map(FieldError::getDefaultMessage).collect(Collectors.joining(","));
return res.error511(msg);
} else if (e instanceof ConstraintViolationException) {
ConstraintViolationException violationException = (ConstraintViolationException) e;
Set<ConstraintViolation<?>> constraintViolations = violationException.getConstraintViolations();
String msg = constraintViolations.stream().map(o -> String.valueOf(o.getMessage())).collect(Collectors.joining(","));
return res.error511(msg);
} else if (e instanceof BindException) {
BindException bindException = (BindException) e;
BindingResult bindingResult = bindException.getBindingResult();
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
List<Object> collect = fieldErrors.stream().map(error -> error.getDefaultMessage()).collect(Collectors.toList());
return res.error511(StringUtils.join(collect, ","));
} else {
return res.error511(e.getMessage());
}
}
}
處理后:
參考:https://blog.csdn.net/qq_42956993/article/details/129199922文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-653433.html
到了這里,關(guān)于springboot引入校驗(yàn)注解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!