最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot使用validation-api實(shí)現(xiàn)對枚舉類參數(shù)校驗(yàn)的方法

 更新時(shí)間:2020年11月02日 14:25:05   作者:后端開發(fā)技術(shù)  
這篇文章主要介紹了SpringBoot使用validation-api實(shí)現(xiàn)對枚舉類參數(shù)校驗(yàn),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

前言

之前寫了一個博客是關(guān)于使用SpringBoot使用validation-api實(shí)現(xiàn)參數(shù)校驗(yàn),當(dāng)時(shí)使用的注解都是validation-api自帶的注解只能完成對空值、長度等簡單的校驗(yàn),在我們?nèi)粘5氖褂卯?dāng)中會遇到對參數(shù)是否在枚舉值類的校驗(yàn),針對這種情況我們怎么來實(shí)現(xiàn)呢?

SpringBoot使用validation-api實(shí)現(xiàn)參數(shù)校驗(yàn)可參考我的博客:SpringBoot使用validation-api實(shí)現(xiàn)參數(shù)校驗(yàn)

正文

SpringBoot使用validation-api實(shí)現(xiàn)對枚舉類參數(shù)校驗(yàn)

ValidationApi框架就是用來解決參數(shù)校驗(yàn)中代碼冗余問題,ValidationApi框架提供一些注解用來幫助我們對請求參數(shù)進(jìn)行校驗(yàn)。

Maven依賴

<!--參數(shù)校驗(yàn)-->
<dependency>
 <groupId>javax.validation</groupId>
 <artifactId>validation-api</artifactId>
 <version>2.0.1.Final</version>
</dependency>


<!--提供一些字符串操作-->
<dependency>
 <groupId>org.apache.commons</groupId>
 <artifactId>commons-lang3</artifactId>
 <version>3.3.2</version>
</dependency>


<!--lombok-->
<dependency>
 <groupId>org.projectlombok</groupId>
 <artifactId>lombok</artifactId>
 <version>1.18.2</version>
 <optional>true</optional>
</dependency>


<!--knife4j接口-->
<dependency>
 <groupId>com.github.xiaoymin</groupId>
 <artifactId>knife4j-spring-boot-starter</artifactId>
 <version>2.0.4</version>
</dependency>

EnumValidate:用于對枚舉校驗(yàn)的接口

/**
* 用于實(shí)現(xiàn)枚舉類的校驗(yàn)
*/
public interface EnumValidate<T> {

 /**
 * 校驗(yàn)枚舉值是否存在
 */
 boolean existValidate(T value);
}

ActionTypeEnumValid:用于對枚舉類校驗(yàn)的自定義注解

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {ActionTypeEnumValidator.class})
@Documented
public @interface ActionTypeEnumValid {

 String message() default "";


 Class<?>[] groups() default {};


 Class<? extends Payload>[] payload() default {};


 Class<?>[] target() default {};

 /**
 * 允許的枚舉
 *
 * @return
 */
 Class<? extends Enum<?>> enumClass();
}

ActionTypeEnumValidator:枚舉校驗(yàn)器

/**
* 用于校驗(yàn)ActionTypeEnumValidator
*/
public class ActionTypeEnumValidator implements ConstraintValidator<ActionTypeEnumValid,String> {


 private Class<? extends Enum> enumClass;


 @Override
 public void initialize(ActionTypeEnumValid actionTypeEnumValid) {
 enumClass = actionTypeEnumValid.enumClass();
 }


 @Override
 public boolean isValid(String value, ConstraintValidatorContext context) {
 if (value == null || "".equals(value)) {
 return true;
 }


 EnumValidate[] enums = (EnumValidate[]) enumClass.getEnumConstants();
 if(enums ==null || enums.length == 0){
 return false;
 }


 return enums[0].existValidate(value);
 }

}

ActionTypeEnum:枚舉類

@Getter
public enum ActionTypeEnum implements EnumValidate<String> {


 ACTION_INVOKR("invoke", "invoke"),
 UNKNOWN_ERROR("no", "no");

 /**
 * 狀態(tài)值
 */
 private String couponType;

 /**
 * 狀態(tài)描述
 */
 private String couponTypeDesc;

 ActionTypeEnum(String couponType, String couponTypeDesc) {
 this.couponType = couponType;
 this.couponTypeDesc = couponTypeDesc;
 }


 public static String getDescByType(String couponType) {
 for (ActionTypeEnum type : ActionTypeEnum.values()) {
 if (type.couponType.equals(couponType) ) {
 return type.couponTypeDesc;
 }
 }
 return null;
 }

 /**
 * 判斷是否在枚舉類當(dāng)中
 * @param value
 * @return
 */
 @Override
 public boolean existValidate(String value) {
 if (value == null || "".equals(value)) {
 return false;
 }
 for (ActionTypeEnum testEnum : ActionTypeEnum.values()) {
 if (testEnum.getCouponType().equalsIgnoreCase(value)) {
 return true;
 }
 }
 return false;
 }

 public String getcouponTypeStr() {
 return String.valueOf(this.couponType);
 }
}

GlobalExceptionHandler:使用SpringMVC提供的異常處理機(jī)制,對ValidationApi的異常進(jìn)行封裝

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

 /**
 * 忽略參數(shù)異常處理器
 *
 * @param e 忽略參數(shù)異常
 * @return Response
 */
 @ResponseStatus(HttpStatus.BAD_REQUEST)
 @ExceptionHandler(MissingServletRequestParameterException.class)
 public ResponseResult parameterMissingExceptionHandler(MissingServletRequestParameterException e) {
 log.error("參數(shù)異常", e);
 return new ResponseResult(CouponTypeEnum.PARAMETER_ERROR.getcouponTypeStr(), "請求參數(shù) " + e.getParameterName() + " 不能為空");
 }


 /**
 * 缺少請求體異常處理器
 *
 * @param e 缺少請求體異常
 * @return Response
 */
 @ResponseStatus(HttpStatus.BAD_REQUEST)
 @ExceptionHandler(HttpMessageNotReadableException.class)
 public ResponseResult parameterBodyMissingExceptionHandler(HttpMessageNotReadableException e) {
 log.error("缺少請求體異常", e);
 return new ResponseResult(CouponTypeEnum.PARAMETER_ERROR.getcouponTypeStr(), "參數(shù)體不能為空");
 }


 /**
 * 參數(shù)效驗(yàn)異常處理器
 *
 * @param e 參數(shù)驗(yàn)證異常
 * @return ResponseInfo
 */
 @ResponseStatus(HttpStatus.BAD_REQUEST)
 @ExceptionHandler(MethodArgumentNotValidException.class)
 public ResponseResult parameterExceptionHandler(MethodArgumentNotValidException e) {
 log.error("參數(shù)驗(yàn)證異常", e);
 // 獲取異常信息
 BindingResult exceptions = e.getBindingResult();
 // 判斷異常中是否有錯誤信息,如果存在就使用異常中的消息,否則使用默認(rèn)消息
 if (exceptions.hasErrors()) {
 List<ObjectError> errors = exceptions.getAllErrors();
 if (!errors.isEmpty()) {
 // 這里列出了全部錯誤參數(shù),按正常邏輯,只需要第一條錯誤即可
 FieldError fieldError = (FieldError) errors.get(0);
 return new ResponseResult(CouponTypeEnum.PARAMETER_ERROR.getcouponTypeStr(), fieldError.getDefaultMessage());
 }
 }
 return new ResponseResult(CouponTypeEnum.PARAMETER_ERROR);
 }


 /**
 * 自定義參數(shù)錯誤異常處理器
 *
 * @param e 自定義參數(shù)
 * @return ResponseInfo
 */
 @ResponseStatus(HttpStatus.BAD_REQUEST)
 @ExceptionHandler({BusinessException.class})
 public ResponseResult paramExceptionHandler(BusinessException e) {
 log.error("業(yè)務(wù)異常", e);
 // 判斷異常中是否有錯誤信息,如果存在就使用異常中的消息,否則使用默認(rèn)消息
 if (!StringUtils.isEmpty(e.getMessage())) {
 return new ResponseResult(CouponTypeEnum.PARAMETER_ERROR.getcouponTypeStr(), e.getMessage());
 }
 return new ResponseResult(CouponTypeEnum.PARAMETER_ERROR);
 }


 /**
 * 其他異常
 *
 * @param e
 * @return
 */
 @ResponseStatus(HttpStatus.BAD_REQUEST)
 @ExceptionHandler({Exception.class})
 public ResponseResult otherExceptionHandler(Exception e) {
 log.error("其他異常", e);
 // 判斷異常中是否有錯誤信息,如果存在就使用異常中的消息,否則使用默認(rèn)消息
 if (!StringUtils.isEmpty(e.getMessage())) {
 return new ResponseResult(CouponTypeEnum.UNKNOWN_ERROR.getcouponTypeStr(), e.getMessage());
 }
 return new ResponseResult(CouponTypeEnum.UNKNOWN_ERROR);
 }
}

驗(yàn)證

請求的封裝類

/**
* 指令的封裝類
*/
@Getter
@Setter
@ToString
public class CommandPOJO implements Serializable {
 private static final long serialVersionUID = -8497328408069586664L;

 //指令
 @NotNull(message = "指令為必填項(xiàng),不得為空")
 @ActionTypeEnumValid(message = "該指令暫不支持,暫時(shí)只支持invoke", enumClass = ActionTypeEnum.class)
 private String action ="invoke";

}

請求接口

@Valid 用于開啟請求參數(shù)校驗(yàn)

@RestController
@Slf4j
@Api(value = "遠(yuǎn)程調(diào)用模塊")
@RequestMapping("/xiyuanrpc")
public class RPCController {

 @PostMapping("/rpcNettybyInvoke")
 @ApiOperation(value = "rpc遠(yuǎn)程調(diào)用")
 @InvokeParameterCheck
 @MethodLogPrint
 public ResponseResult rpcNettybyInvoke(@Valid @RequestBody CommandPOJO pojo) {
 return NettyClientUtil.rpcNetty(pojo);
 }

}

通過Knife4j訪問對應(yīng)接口

在這里插入圖片描述

源碼

項(xiàng)目源碼可從的我的github中獲?。?a rel="external nofollow" target="_blank">github源碼地址

到此這篇關(guān)于SpringBoot使用validation-api實(shí)現(xiàn)對枚舉類參數(shù)校驗(yàn)的方法的文章就介紹到這了,更多相關(guān)SpringBoot枚舉類參數(shù)校驗(yàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java面試題之this 和 super 的區(qū)別解析

    Java面試題之this 和 super 的區(qū)別解析

    this 和 super 雖然都是Java中的關(guān)鍵字,但它們的作用和使用場景有著明顯的區(qū)別,下面給大家介紹Java面試題之this 和 super 的區(qū)別解析,感興趣的朋友一起看看吧
    2025-05-05
  • Java8中Stream的使用方式

    Java8中Stream的使用方式

    這篇文章主要介紹了Java8中Stream的使用方式,文章通過Stream的創(chuàng)建展開詳細(xì)的介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-04-04
  • Java同步框架AbstractQueuedSynchronizer詳解

    Java同步框架AbstractQueuedSynchronizer詳解

    本篇文章主要介紹了Java同步框架AbstractQueuedSynchronizer詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • 使用 Java 開發(fā) Gradle 插件的步驟

    使用 Java 開發(fā) Gradle 插件的步驟

    這篇文章主要介紹了使用 Java 開發(fā) Gradle 插件的步驟,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • idea全局搜索快捷鍵超詳細(xì)總結(jié)(推薦!)

    idea全局搜索快捷鍵超詳細(xì)總結(jié)(推薦!)

    在實(shí)際開發(fā)中項(xiàng)目會非常多,如何在項(xiàng)目中快速定位,你說需要找到的類或方法,可以利用idea的全局搜索功能,下面這篇文章主要給大家分享介紹了關(guān)于idea全局搜索快捷鍵超詳細(xì)總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • RPC框架之Thrift的入門教程

    RPC框架之Thrift的入門教程

    Thrift是一個跨語言的服務(wù)部署框架,主要用于各個服務(wù)之間的RPC通信,支持跨語言,下面小編就來和大家講講Thrift框架的具體使用,希望對大家有所幫助
    2023-10-10
  • Java實(shí)現(xiàn)字符編碼轉(zhuǎn)換(utf-8/gbk)

    Java實(shí)現(xiàn)字符編碼轉(zhuǎn)換(utf-8/gbk)

    這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)字符編碼轉(zhuǎn)換工具,主要針對UTF-8和GBK兩種編碼格式,文中的示例代碼講解詳,需要的可以了解下
    2025-03-03
  • Java 靜態(tài)數(shù)據(jù)初始化的示例代碼

    Java 靜態(tài)數(shù)據(jù)初始化的示例代碼

    這篇文章主要介紹了Java 靜態(tài)數(shù)據(jù)初始化的示例代碼,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-09-09
  • IntelliJ?IDEA中引入自定義JAR包詳細(xì)步驟

    IntelliJ?IDEA中引入自定義JAR包詳細(xì)步驟

    導(dǎo)入JAR包是使用其他模塊或庫開發(fā)Java應(yīng)用程序的必要步驟,這篇文章主要介紹了IntelliJ?IDEA中引入自定義JAR包的詳細(xì)步驟,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-12-12
  • 深入理解JAVA多線程之線程間的通信方式

    深入理解JAVA多線程之線程間的通信方式

    下面小編就為大家?guī)硪黄钊肜斫釰AVA多線程之線程間的通信方式。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05

最新評論

楚雄市| 梁山县| 肃南| 绥化市| 昭通市| 县级市| 台湾省| 延安市| 永仁县| 南靖县| 集贤县| 汕尾市| 碌曲县| 股票| 丹江口市| 长泰县| 民勤县| 乐亭县| 寿光市| 漳平市| 香河县| 海原县| 嘉义县| 格尔木市| 商河县| 高青县| 页游| 田东县| 安图县| 婺源县| 老河口市| 江阴市| 宝山区| 清丰县| 日土县| 宁蒗| 龙山县| 泽普县| 平谷区| 东海县| 辉南县|