使用validate注解做校验以及自定义validate注解
生活随笔
收集整理的這篇文章主要介紹了
使用validate注解做校验以及自定义validate注解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Springboot版本:2.3.1.RELEASE
引入依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency>ps:Springboot版本在2.3一下的引用的是別的依賴,可以查一下。
新增用戶請求體
package com.study.bean.dto;import com.study.bean.volidate.AgeAdultCompare; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data;import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull;/*** @Author Curtain* @Date 2021/4/26 15:34* @Description*/ @Data @ApiModel("新增用戶請求體") @AgeAdultCompare public class AddPersonParam {/*** 姓名*/@NotBlank(message = "姓名不能為空")@ApiModelProperty(name = "name", value = "姓名", required = true)private String name;/*** 性別*/@NotBlank(message = "性別不能為空")@ApiModelProperty(name = "sex", value = "性別", required = true)private String sex;/*** 年齡*/@NotNull(message = "年齡不能為空")@Min(value = 0, message = "年齡最小為10歲")@Max(value = 1000, message = "人類目前年齡超不過1000歲")@ApiModelProperty(name = "age", value = "年齡", required = true)private Integer age;/*** 0未成年1成年*/@NotNull(message = "是否成年不能為空")@ApiModelProperty(name = "adult", value = "0未成年1成年", required = true)private Integer adult; }這里涵蓋了validate注解中的@NotNull、@NotBlank、@Min、@Max還有個自定義的validate注解@AgeAdultCompare。
除了自定義的validate注解以外,其他的幾個注解想必大家一眼就能看出來是什么意思,這里就不再贅述。
自定義的@AgeAdultCompare注解
作用:用來校驗年齡和是否成年這兩個字段是否相對應(年齡大于18必須是成年,年齡小于18必須是未成年)
首先是定義一個validate類型的注解
package com.study.bean.volidate;import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*;/*** @Author Curtain* @Date 2021/4/26 15:40* @Description 自定義注解,校驗年齡和是否成年*/ @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Constraint(validatedBy = AgeAdultValidator.class) public @interface AgeAdultCompare {//校驗未通過時的返回信息String message() default "年齡和是否成年要相對應";//以下兩行未固定模板Class<?>[] groups() default { };Class<? extends Payload>[] payload() default { }; }其中的AgeAdultValidator就是我們要創建的校驗類,里面寫的是校驗邏輯.
AgeAdultValidator
package com.study.bean.volidate;import com.study.bean.dto.AddPersonParam;import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext;/*** @Author Curtain* @Date 2021/4/26 15:41* @Description*/ public class AgeAdultValidator implements ConstraintValidator<AgeAdultCompare, Object> {@Overridepublic boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {if (o instanceof AddPersonParam){AddPersonParam param = (AddPersonParam) o;if (param.getAge() != null && param.getAdult() != null){if (param.getAge() > 17 && param.getAdult() == 0)return false;if (param.getAge() < 17 && param.getAdult() == 1)return false;}}return true;}}這些都寫完之后,我們要在接口上面的請求參數前加上@valid注解就完事了
package com.study.web.controller;import com.study.bean.dto.AddPersonParam; import com.study.bean.response.ResultBody; import com.study.service.api.db01.PersonService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource; import javax.validation.Valid;/*** @Author Curtain* @Date 2021/4/26 15:49* @Description*/ @RestController @RequestMapping("/api/v1") @Api(tags = "人員控制類") public class PersonController {@Resourceprivate PersonService personService;@PostMapping("/person")@ApiOperation(value = "新增人員", notes = "新增人員")ResultBody addPerson(@RequestBody @Valid AddPersonParam addPersonParam){return ResultBody.success(personService.add(addPersonParam));} }測試接口的時候,不符合我們注解的要求都會拋出一個叫做MethodArgumentNotValidException的異常。
如果我們想把我們在validate相關注解中的message信息返回給調用的人,我們可以定義一個全局的異常捕獲。
全局異常捕獲類
package com.study.web.config;import com.study.bean.enums.ResponseEnum; import com.study.bean.exception.ApiException; import com.study.bean.response.ResultBody; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestControllerAdvice;import javax.validation.ConstraintViolationException; import java.util.stream.Collectors;@RestControllerAdvice public class GlobalExceptionHandler {private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);/*** 捕獲全局入參錯誤異常* @param e* @return*/@ExceptionHandler(MethodArgumentNotValidException.class)public ResultBody handleGlobalException(MethodArgumentNotValidException e){return ResultBody.error(e.getBindingResult().getAllErrors().stream().map(a -> a.getDefaultMessage()).collect(Collectors.joining(",")));}}這里的ResultBody是我自己寫的一個返回實體類。
ResultBody
package com.study.bean.response;import com.study.bean.enums.ResponseEnum; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter;/*** @Author Curtain* @Date 2021/4/15 20:12* @Description*/ @Getter @Setter @AllArgsConstructor @NoArgsConstructor public class ResultBody<T> {/*** 狀態碼*/private String code;/*** 狀態信息*/private String message;/*** 接口返回數據*/private T result;public static ResultBody success(){return success(null);}public static <T> ResultBody<T> success(T o) {ResultBody resultBody = new ResultBody(ResponseEnum.SUCCESS);resultBody.setResult(o);return resultBody;}public static ResultBody error(String code, String message){return new ResultBody(code, message, null);}public static ResultBody error(String message){return new ResultBody("-1", message, null);} }可以根據自己的需求刪減和補充。
最后附上一個測試結果圖
?
總結
以上是生活随笔為你收集整理的使用validate注解做校验以及自定义validate注解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java如何做聚类分析_K-means算
- 下一篇: hangfire安装