springboot aop方式實(shí)現(xiàn)接口入?yún)⑿r?yàn)的示例代碼
一、前言
在實(shí)際開發(fā)項(xiàng)目中,我們常常需要對(duì)接口入?yún)⑦M(jìn)行校驗(yàn),如果直接在業(yè)務(wù)代碼中進(jìn)行校驗(yàn),則會(huì)顯得代碼非常冗余,也不夠優(yōu)雅,那么我們可以使用aop的方式校驗(yàn),這樣則會(huì)顯得更優(yōu)雅。
二、如何實(shí)現(xiàn)?
1.添加maven依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
2.定義一個(gè)工具類ValidationUtil
import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; import java.util.ArrayList; import java.util.List; import java.util.Set; public class ValidationUtil { private static ValidationUtil util; private Validator validator; public ValidationUtil() { // TODO Auto-generated constructor stub ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); this.validator = factory.getValidator(); } /** * @return the validator */ public Validator getValidator() { return validator; } public static ValidationUtil getValidationUtil() { if (util == null) { util = new ValidationUtil(); } return util; } public static List<CheckErrorResultDto> validate(Object o) { Set<ConstraintViolation<Object>> set = ValidationUtil .getValidationUtil().getValidator().validate(o); List<CheckErrorResultDto> errorList = null; HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder .getRequestAttributes()).getRequest(); for (ConstraintViolation<Object> cv : set) { if (errorList == null) { errorList = new ArrayList<CheckErrorResultDto>(); } String message = MessageResolver.getMessage(request, cv.getMessage()); errorList.add(new CheckErrorResultDto(cv.getPropertyPath() .toString(), message)); } return errorList; } public static List<CheckErrorResultDto> validate(Object o,Class<?> ...c) { Set<ConstraintViolation<Object>> set = ValidationUtil .getValidationUtil().getValidator().validate(o,c); List<CheckErrorResultDto> errorList = null; HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder .getRequestAttributes()).getRequest(); for (ConstraintViolation<Object> cv : set) { if (errorList == null) { errorList = new ArrayList<CheckErrorResultDto>(); } String message = MessageResolver.getMessage(request, cv.getMessage()); errorList.add(new CheckErrorResultDto(cv.getPropertyPath() .toString(), message)); } return errorList; }
3.校驗(yàn)錯(cuò)誤信息實(shí)體類。
import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @Data @Builder @AllArgsConstructor @NoArgsConstructor public class CheckErrorResultDto { private String fieldName; private String msg; }
4.編寫校驗(yàn)AOP
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; @Order(1) @Aspect @Component @EnableAspectJAutoProxy(exposeProxy=true) public class ValidAop { /** * 校驗(yàn)傳入實(shí)體 * * @param pjp * @throws Throwable */ @Around("@annotation(com.smartcitysz.dp.dataasset.aop.annotation.Valid)") public Object aroundExec(ProceedingJoinPoint pjp) throws Throwable { MethodSignature ms = (MethodSignature) pjp.getSignature(); Method method = ms.getMethod(); Valid annotation = method.getAnnotation(Valid.class); if (annotation != null) { List<CheckErrorResultDto> errorList=new ArrayList<CheckErrorResultDto>(); Object[] args=pjp.getArgs(); Class<?>[] checkToken = annotation.value(); Class<?>[] group = annotation.group(); for (Class c : checkToken) { for (Object obj : args) { if (c == obj.getClass()) { List<CheckErrorResultDto> result=null; if(group.length<1){ result= ValidationUtil.validate(obj); }else{ result= ValidationUtil.validate(obj,group); } if(result!=null) errorList.addAll(result); } } } if(errorList.size()>0){ ResponseData vo=new ResponseData(); vo.setCode(ApiCodeEnum.ILLEGAL_PARAMETER.getCode()); vo.setMsg(ApiCodeEnum.ILLEGAL_PARAMETER.getMsg()); vo.setData(errorList); return vo; } } return pjp.proceed(); } }
5.定義一個(gè)校驗(yàn)注解Valid
import java.lang.annotation.*; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Valid { Class<?>[] value() default {}; Class<?>[] group() default {}; }
6.最后在Controller定義的接口上加上注解指定要校驗(yàn)的對(duì)象即可。
到此這篇關(guān)于springboot aop方式實(shí)現(xiàn)接口入?yún)⑿r?yàn)的示例代碼的文章就介紹到這了,更多相關(guān)springboot aop接口入?yún)⑿r?yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
三種Python比較兩個(gè)時(shí)間序列在圖形上是否相似的方法分享
這篇文章主要為大家詳細(xì)介紹了三種Python中比較兩個(gè)時(shí)間序列在圖形上是否相似的方法,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以了解一下2023-03-03matplotlib設(shè)置坐標(biāo)軸標(biāo)簽和間距的實(shí)現(xiàn)
本文主要介紹了matplotlib設(shè)置坐標(biāo)軸標(biāo)簽和間距的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10?Python使用Mediapipe對(duì)圖像進(jìn)行手部地標(biāo)檢測(cè)
本文將以深度庫即Mediapipe為基礎(chǔ)庫,以及其他計(jì)算機(jī)視覺預(yù)處理的CV2庫來制作手部地標(biāo)檢測(cè)模型,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-03-03TensorFlow Session使用的兩種方法小結(jié)
今天小編就為大家分享一篇TensorFlow Session使用的兩種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07使用Python程序抓取新浪在國(guó)內(nèi)的所有IP的教程
這篇文章主要介紹了使用Python程序抓取新浪在國(guó)內(nèi)的所有IP的教程,作為Python網(wǎng)絡(luò)編程中獲取IP的一個(gè)小實(shí)踐,需要的朋友可以參考下2015-05-05基于Python數(shù)據(jù)分析之pandas統(tǒng)計(jì)分析
這篇文章主要介紹了基于Python數(shù)據(jù)分析之pandas統(tǒng)計(jì)分析,具有很好對(duì)參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03