springboot aop方式實現(xiàn)接口入?yún)⑿r灥氖纠a
一、前言
在實際開發(fā)項目中,我們常常需要對接口入?yún)⑦M行校驗,如果直接在業(yè)務代碼中進行校驗,則會顯得代碼非常冗余,也不夠優(yōu)雅,那么我們可以使用aop的方式校驗,這樣則會顯得更優(yōu)雅。
二、如何實現(xiàn)?
1.添加maven依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
2.定義一個工具類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.校驗錯誤信息實體類。
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.編寫校驗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 { /** * 校驗傳入實體 * * @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.定義一個校驗注解Valid
import java.lang.annotation.*; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Valid { Class<?>[] value() default {}; Class<?>[] group() default {}; }
6.最后在Controller定義的接口上加上注解指定要校驗的對象即可。
到此這篇關于springboot aop方式實現(xiàn)接口入?yún)⑿r灥氖纠a的文章就介紹到這了,更多相關springboot aop接口入?yún)⑿r瀮?nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
TensorFlow Session使用的兩種方法小結(jié)
今天小編就為大家分享一篇TensorFlow Session使用的兩種方法小結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07使用Python程序抓取新浪在國內(nèi)的所有IP的教程
這篇文章主要介紹了使用Python程序抓取新浪在國內(nèi)的所有IP的教程,作為Python網(wǎng)絡編程中獲取IP的一個小實踐,需要的朋友可以參考下2015-05-05基于Python數(shù)據(jù)分析之pandas統(tǒng)計分析
這篇文章主要介紹了基于Python數(shù)據(jù)分析之pandas統(tǒng)計分析,具有很好對參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03