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. Linux文件系统目录结构详解

    在我们初学嵌入式Linux时,首先学习的就是Linux的最小根文件系统:下面我将为初学者们详细的阐述一下Linux的最小根文件系统. 根目录在Linux中即为“/”,要进入根目录,命令“cd  /”即 ...

  2. Quartz每次调度时被执行两次

    [关键字:重复执行.重复调用.每次执行两次.执行2次] 前言: 先说一下,项目背景.由于组内某成员在用Maven搭建项目时不规范,导致项目的名称与实际访问项目名称不一致.在部署项目时,必需要配一下虚拟 ...

  3. 设计模式-模块方法模式(TemplateMethod)

    模块方法模式是行为模式之一,它把具有特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承对抽象方法的不同实现改变整个算法的行为. UML图: 具体代码: /** * 抽象-模块方法模式核心 */ ...

  4. Oracle 数据库连接不上 登录一直卡死

    在此记录下半个月来,oracle数据库本地神奇地连接不了的事件. 描述下我的情况: (1)使用navicat连接本地的数据库,结果一直卡[正在连接中(无响应)]: (2)使用PL/SQL连接本地的数据 ...

  5. scrapy基础知识之 scrapy 三种模拟登录策略:

    注意:模拟登陆时,必须保证settings.py里的 COOKIES_ENABLED (Cookies中间件) 处于开启状态 COOKIES_ENABLED = True或 # COOKIES_ENA ...

  6. Docker笔记(一):什么是Docker

    原文地址: http://blog.jboost.cn/2019/07/13/docker-1.html  1. 前言 接触Docker也有两年多了,断断续续玩过一些应用场景,如安装一些常用工具服务, ...

  7. linux修改时间显示格式

    1. 问题描述 Linux下经常使用 "ls - ll"命令查看文件夹或文件创建及权限信息,但是满屏的Mar .May.Jul有点小难受. 2. 解决方案 修改bash_profi ...

  8. ~~函数基础(一):函数&参数~~

    进击のpython 函数基础(一):参数 ==说明一点奥,如果你前置文章没有看懂,那么不建议你直接看这个== ==因为看了也是浪费时间,没有意义== 好,接下来就是Python的灵魂部分了--函数 在 ...

  9. python之pip install

    安装方式1 wget  http://python-distribute.org/distribute_setup.py sudo python distribute_setup.py wget  h ...

  10. CNN神经网络之卷积操作

    在看这两个函数之前,我们需要先了解一维卷积(conv1d)和二维卷积(conv2d),二维卷积是将一个特征图在width和height两个方向进行滑动窗口操作,对应位置进行相乘求和:而一维卷积则只是在 ...