Spring aop 拦截自定义注解+分组验证参数
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 拦截自定义注解+分组验证参数的更多相关文章
- spring AOP 和自定义注解进行身份验证
一个SSH的项目(springmvc+hibernate),需要提供接口给app使用.首先考虑的就是权限问题,app要遵循极简模式,部分内容无需验证,用过滤器不能解决某些无需验证的方法 所以最终选择用 ...
- 用AOP拦截自定义注解并获取注解属性与上下文参数(基于Springboot框架)
目录 自定义注解 定义切面 获取上下文信息JoinPoint ProceedingJoinPoint 定义测试方法 测试结果 小结 AOP可以用于日志的设计,这样话就少不了要获取上下文的信息,博主在设 ...
- 利用Spring AOP和自定义注解实现日志功能
Spring AOP的主要功能相信大家都知道,日志记录.权限校验等等. 用法就是定义一个切入点(Pointcut),定义一个通知(Advice),然后设置通知在该切入点上执行的方式(前置.后置.环绕等 ...
- 运用Spring Aop,一个注解实现日志记录
运用Spring Aop,一个注解实现日志记录 1. 介绍 我们都知道Spring框架的两大特性分别是 IOC (控制反转)和 AOP (面向切面),这个是每一个Spring学习视频里面一开始都会提到 ...
- Spring Boot实现自定义注解
在Spring Boot项目中可以使用AOP实现自定义注解,从而实现统一.侵入性小的自定义功能. 实现自定义注解的过程也比较简单,只需要3步,下面实现一个统一打印日志的自定义注解: 1. 引入AOP依 ...
- 从零开始学 Java - Spring AOP 拦截器的基本实现
一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...
- java自定义注解实现前后台参数校验
2016.07.26 qq:992591601,欢迎交流 首先介绍些基本概念: Annotations(also known as metadata)provide a formalized way ...
- Java - Spring AOP 拦截器的基本实现
一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...
- spring boot通过自定义注解和AOP拦截指定的请求
一 准备工作 1.1 添加依赖 通过spring boot创建好工程后,添加如下依赖,不然工程中无法使用切面的注解,就无法对制定的方法进行拦截 <dependency> <group ...
随机推荐
- bugku welcome to bugkuctf
题目地址:http://123.206.87.240:8006/test1/ 这道题主要用到了俩个知识点:php伪协议和序列化 点进题目看到:you are not the number of bug ...
- hive 之 Cube, Rollup介绍
1. GROUPING SETS GROUPING SETS作为GROUP BY的子句,允许开发人员在GROUP BY语句后面指定多个统维度,可以简单理解为多条group by语句通过union al ...
- 微信支付重复回调,java微信支付回调问题
这几天一直在研究微信支付回调这个问题,发现之前微信支付回调都是正常的也没怎么在意,今天在自己项目上测试的时候发现相同的代码在我这个项目上微信支付回调老是重复执行导致支付成功之后的回调逻辑一直在执行,很 ...
- 充气娃娃什么感觉?Python告诉你
上期为大家介绍了requests库的基本信息以及使用requests库爬取某东的商品页,收到了很多同学的反馈说期待猪哥的更新,猪哥感到非常开心,今天就带大家来玩一把刺激的! 一.需求背景 在实际开发过 ...
- 前端笔记之React(四)生命周期&Virtual DOM和Diff算法&日历组件开发
一.React生命周期 一个组件从出生到消亡,在各个阶段React提供给我们调用的接口,就是生命周期. 生命周期这个东西,必须有项目,才知道他们干嘛的. 1.1 Mouting阶段[装载过程] 这个阶 ...
- 微信开发:微信js_sdk 分享,前端部分(二)
微信开发:微信js-sdk前端分享,代码如下: <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"> ...
- [原创]MYSQL周期备份shell脚本
这个脚本是实现阿里云mysql数据库全量周期备份的shell脚本,实现备份数据按一周星期几分开存放.一下是脚本内容: #!/bin/bash echo `date`echo "backup ...
- USACO-集合
#include<cstdio> #include<iostream> using namespace std; long long f[400]; int main() { ...
- 洛谷 P4363 [九省联考2018]一双木棋chess 题解
题目链接:https://www.luogu.org/problemnew/show/P4363 分析: 首先博弈,然后考虑棋盘的规则,因为一个子在落下时它的上面和左面都已经没有空位了,所以棋子的右下 ...
- spark 源码分析之十七 -- Spark磁盘存储剖析
上篇文章 spark 源码分析之十六 -- Spark内存存储剖析 主要剖析了Spark 的内存存储.本篇文章主要剖析磁盘存储. 总述 磁盘存储相对比较简单,相关的类关系图如下: 我们先从依赖类 Di ...