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. 关于重写equals()和hashCode()的思考

    最近这几天一直对equals()和hashCode()的事搞不清楚,云里雾里的. 为什么重写equals(),我知道. 但是为什么要两个都要重写呢,我就有点迷糊了,所以趁现在思考清楚后记录一下. 起因 ...

  2. C++ 洛谷 P1731 [NOI1999]生日蛋糕

    P1731 [NOI1999]生日蛋糕 一本通上也有. 这TM是一道极其简单的深搜剪枝(DP当然可以的了,这里我只讲深搜). 首先圆柱公式:(有点数学基础都知道) V=πR2H S侧=π2RH S底= ...

  3. 深入理解Java虚拟机笔记——垃圾收集器与内存分配策略

    目录 判断对象是否死亡 引用计数器算法 可达性分析算法 各种引用 回收方法区 垃圾收集算法 标记-清除算法 复制算法 标记-整理算法 分代收集算法 HotSpot算法实现 枚举根节点 GC停顿(Sto ...

  4. POJ 1743:Musical Theme(后缀数组+二分)

    题目链接 题意 有N个音符的序列来表示一首乐曲,每个音符都是1到88范围内的整数,现在要找一个重复的主题."主题"是整个音符序列的一个子串,它需要满足如下条件: 长度至少为5个音符 ...

  5. POJ 3692:Kindergarten(二分图最大团)

    题目链接 题意 已知班级有g个女孩和b个男孩,所有女生之间都相互认识,所有男生之间也相互认识,给出m对关系表示哪个女孩与哪个男孩认识.现在要选择一些学生来组成一个集合,使得里面所有人都认识,求此集合最 ...

  6. linux命令积累

    lsof -i: //根据端口号查相关信息 //杀进程 ps -ef|grep appName //根据进程名称查找相关信息 grep -r "关键词" 目录 //在制定目录下根据 ...

  7. redux和react-redux做简单组件控制

    这次我们用两种方式实现以下要求 1.三个组件 2.第一个组件有两个按钮 分别控制第二和第三个组件年龄和姓名的改变 3第二个组件展示姓名,第三个组件展示年龄 用到哪些插件 store  redux 一 ...

  8. Docker环境下的前后端分离项目部署与运维(十二)使用Portainer管理Docker

    安装 docker hub地址:https://hub.docker.com/r/portainer/portainer/ # 每台服务器都要安装 docker pull portainer/port ...

  9. Java实现异步调用

    一.创建线程 @Test public void test0() throws Exception { System.out.println("main函数开始执行"); Thre ...

  10. java网络爬虫,乱码问题终于完美解决

    第一次写爬虫,被乱码问题困扰两天,试了很多方法都不可以,今天随便一试,居然好了. 在获取网页时创建了一个缓冲字节输入流,问题就在这个流上,添加标红代码即可 BufferedReader in = nu ...