import com.hsq.common.enums.ResponseState;
import com.hsq.common.response.ResponseVO;
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.stereotype.Component; import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List; @Aspect
@Component
@EnableAspectJAutoProxy(exposeProxy=true)
public class ValidAop { /**
* 校验传入实体
*
* @param pjp
* @throws Throwable
*/
@Around("@annotation(com.hsq.common.validate.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<CheckErrorResultBean> errorList=new ArrayList<CheckErrorResultBean>();
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<CheckErrorResultBean> 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){
ResponseVO vo=new ResponseVO();
vo.setResponseCode(ResponseState.CHECKERROR.getCode());
vo.setResponseMsg(ResponseState.CHECKERROR.getMsg());
vo.setData(errorList);
return vo;
}
} return pjp.proceed(); } }
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<CheckErrorResultBean> validate(Object o) {
Set<ConstraintViolation<Object>> set = ValidationUtil
.getValidationUtil().getValidator().validate(o);
List<CheckErrorResultBean> errorList = null;
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
.getRequestAttributes()).getRequest(); for (ConstraintViolation<Object> cv : set) {
if (errorList == null) {
errorList = new ArrayList<CheckErrorResultBean>();
}
String message = MessageResolver.getMessage(request,
cv.getMessage());
errorList.add(new CheckErrorResultBean(cv.getPropertyPath()
.toString(), message)); }
return errorList;
}
/**
* 验证实体列表的正确性
* @param objList
* @return
*/
public static <T> List<CheckErrorResultBean> validateList(List<T> objList) {
if (null == objList || objList.isEmpty()) {
return null;
}
List<CheckErrorResultBean> strList = new ArrayList<CheckErrorResultBean>();
for (Object obj : objList) {
List<CheckErrorResultBean> checkErrorResultBean = validate(obj);
if(null != checkErrorResultBean){
strList.addAll(validate(obj));
}
}
return strList;
} public static List<CheckErrorResultBean> validate(Object o,Class<?> ...c) {
Set<ConstraintViolation<Object>> set = ValidationUtil
.getValidationUtil().getValidator().validate(o,c);
List<CheckErrorResultBean> errorList = null;
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
.getRequestAttributes()).getRequest(); for (ConstraintViolation<Object> cv : set) {
if (errorList == null) {
errorList = new ArrayList<CheckErrorResultBean>();
}
String message = MessageResolver.getMessage(request,
cv.getMessage());
errorList.add(new CheckErrorResultBean(cv.getPropertyPath()
.toString(), message)); }
return errorList;
} }
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.support.RequestContextUtils; import javax.servlet.http.HttpServletRequest;
import java.util.Locale; public class MessageResolver {
/**
* 获得国际化信息
*
* @param request
* HttpServletRequest
* @param code
* 国际化代码
* 替换参数
* @return
* @see org.springframework.context.MessageSource#getMessage(String,
* Object[], Locale)
*/
public static String getMessage(HttpServletRequest request, String code) {
WebApplicationContext messageSource = RequestContextUtils.findWebApplicationContext(request); if (messageSource == null) {
throw new IllegalStateException("WebApplicationContext not found!");
}
LocaleResolver localeResolver = RequestContextUtils
.getLocaleResolver(request);
Locale locale;
if (localeResolver != null) {
locale = localeResolver.resolveLocale(request);
} else {
locale = request.getLocale();
} if(locale==null|| StringUtils.isEmpty(locale.getLanguage())||locale.getLanguage().equalsIgnoreCase("null")){
locale=Locale.CHINA;
} return messageSource.getMessage(code.trim(), null,code,locale);
}
}
import com.paic.sealCenter.common.enums.ResponseState;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; @ApiModel
public class ResponseVO<T> { @ApiModelProperty(value = "响应码", dataType = "string")
private String responseCode; @ApiModelProperty(value = "响应消息", dataType = "string")
private String responseMsg; @ApiModelProperty(value = "响应数据")
private T data; public ResponseVO() {
this.setResponseCode(ResponseState.SUCCESS.getCode());
this.setResponseMsg(ResponseState.SUCCESS.getMsg());
} public ResponseVO(String responseCode) {
this.setResponseCode(responseCode);
} public ResponseVO(String responseCode, String responseMsg) {
this.setResponseCode(responseCode);
this.setResponseMsg(responseMsg);
} public String getResponseCode() {
return responseCode;
} public ResponseVO setResponseCode(String responseCode) {
this.responseCode = responseCode;
return this;
} public String getResponseMsg() {
return responseMsg;
} public ResponseVO setResponseMsg(String responseMsg) {
this.responseMsg = responseMsg;
return this;
} public ResponseVO setData(T data) {
this.data = data;
return this;
} public T getData() {
return data;
}
}
public enum ResponseState {
SUCCESS("10001", "请求成功"),
CHECKERROR("10002","参数验证失败"),
import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Valid { Class<?>[] value() default {};
Class<?>[] group() default {};
}

Spring aop 拦截自定义注解+分组验证参数的更多相关文章

  1. spring AOP 和自定义注解进行身份验证

    一个SSH的项目(springmvc+hibernate),需要提供接口给app使用.首先考虑的就是权限问题,app要遵循极简模式,部分内容无需验证,用过滤器不能解决某些无需验证的方法 所以最终选择用 ...

  2. 用AOP拦截自定义注解并获取注解属性与上下文参数(基于Springboot框架)

    目录 自定义注解 定义切面 获取上下文信息JoinPoint ProceedingJoinPoint 定义测试方法 测试结果 小结 AOP可以用于日志的设计,这样话就少不了要获取上下文的信息,博主在设 ...

  3. 利用Spring AOP和自定义注解实现日志功能

    Spring AOP的主要功能相信大家都知道,日志记录.权限校验等等. 用法就是定义一个切入点(Pointcut),定义一个通知(Advice),然后设置通知在该切入点上执行的方式(前置.后置.环绕等 ...

  4. 运用Spring Aop,一个注解实现日志记录

    运用Spring Aop,一个注解实现日志记录 1. 介绍 我们都知道Spring框架的两大特性分别是 IOC (控制反转)和 AOP (面向切面),这个是每一个Spring学习视频里面一开始都会提到 ...

  5. Spring Boot实现自定义注解

    在Spring Boot项目中可以使用AOP实现自定义注解,从而实现统一.侵入性小的自定义功能. 实现自定义注解的过程也比较简单,只需要3步,下面实现一个统一打印日志的自定义注解: 1. 引入AOP依 ...

  6. 从零开始学 Java - Spring AOP 拦截器的基本实现

    一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...

  7. java自定义注解实现前后台参数校验

    2016.07.26 qq:992591601,欢迎交流 首先介绍些基本概念: Annotations(also known as metadata)provide a formalized way ...

  8. Java - Spring AOP 拦截器的基本实现

    一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...

  9. spring boot通过自定义注解和AOP拦截指定的请求

    一 准备工作 1.1 添加依赖 通过spring boot创建好工程后,添加如下依赖,不然工程中无法使用切面的注解,就无法对制定的方法进行拦截 <dependency> <group ...

随机推荐

  1. Ceph原理动画演示

    动图生动刻画Ceph的基本原理之集群搭建及数据写入流程:)

  2. Thinkphp5.0之异常处理

    1.默认异常处理在调试模式下,系统默认展示的错误页面:请输入图片描述 异常处理接管 1.修改config.php 'app_debug' => false,2.在配置文件里添加如下代码 // 异 ...

  3. Qt定制控件列表

    目录 炫酷进度条 提示框 小时钟 高仿excel表格 多级表头表格 多级表头树控件 多维度折线图 表格控件-蚂蚁线 日历控件 饼图 窗体靠边自动隐藏 下拉框内容定制 模仿QQ上传头像 菜单定制 属性表 ...

  4. vue中轮播图的实现

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 虚拟机linux下git clone 报SSL connect error错误

    今天在安装azkaban时,用git clone https://github.com/azkaban/azkaban.git,虚拟机报了SSL connect error,翻了很多博客,有的说是gi ...

  6. Django rest framework(3)----节流

    目录 Django组件库之(一) APIView源码 Django restframework (1) ----认证 Django rest framework(2)----权限 Django res ...

  7. Linux 文件系统的基本结构

    Linux文件系统为一个倒置的树状结构,所有文件或文件夹均包含在一个根目录/中. Linux系统严格区分大小写所以在Linux中:一个名为“A”的文件夹和一个名为“a”的文件夹是不同的两个文件夹,这点 ...

  8. ~~函数基础(七):生成器&迭代器~~

    进击のpython 生成器 上来说个这,就有点抽象了! 我们先整点活儿 宁,准备好了吗? 直接相位猛冲! 列表生成器 需求来了,老弟!我有一个数组 a = [1, 2, 3, 4, 5, 6, 7, ...

  9. How to Read a Paper丨如何阅读一篇论文

    这是我在看论文时无意刷到的博客推荐的一篇文章"How to Read a Paper",教你怎么样看论文.对于研究生来说,看论文基本是日常,一篇论文十多二十页,如何高效地读论文确实 ...

  10. 为什么说是时候拥抱.NET CORE了?

    微软和社区已经做了大量艰苦的工作,使.Net Core成为市场上具有竞争力的框架,帮助开发人员快速开发具有最佳性能和可扩展性的强大应用程序.做的最棒的事情是.Net Framework开发人员不需要任 ...