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 ...
随机推荐
- kubernetes实战之consul篇及consul在windows下搭建consul简单测试环境
consul是一款服务发现中间件,1.12版本后增加servicemesh功能.consul是分布式的,可扩展的,高可用的根据官方文档介绍,目前已知最大的consul集群有5000个节点,consul ...
- django基础知识之URLconf:
URLconf 在settings.py文件中通过ROOT_URLCONF指定根级url的配置 urlpatterns是一个url()实例的列表 一个url()对象包括: 正则表达式 视图函数 名称n ...
- SQL Server 2016 + AlwaysOn 无域集群
目录 AlwaysOn 搭建 WSFC 配置计算机的 DNS 后缀 安装故障转移集群 验证集群 创建集群 创建文件共享见证 配置 AlwaysOn 新建可用性组 创建侦听器 可读副本的负载均衡 主角色 ...
- Windows下通过VNC远程访问Linux服务器,并实现可视化
前言 最近因部门需要,老大想让我在公司Linux服务器上弄个Oracle,以用作部门测试环境的数据库服务器,经过一番折腾后,成功完成了任务.因公司Linux服务器是无图形界面的,本人接触Linux不多 ...
- Spring MVC源码(二) ----- DispatcherServlet 请求处理流程 面试必问
前端控制器 前端控制器,即所谓的Front Controller,体现的是设计模式中的前端控制器模式.前端控制器处理所有从用户过来的请求.所有用户的请求都要通过前端控制器.SpringMVC框架和其他 ...
- Oracle使用MyBatis中RowBounds实现分页查询
Oracle中分页查询因为存在伪列rownum,sql语句写起来较为复杂,现在介绍一种通过使用MyBatis中的RowBounds进行分页查询,非常方便. 使用MyBatis中的RowBounds进行 ...
- 【DFS的分支限界】(例题-算式等式)
不知道DFS的请滚去 这里瞅一眼再说. -分支限界- 基本概念: 类似于回溯法,也是一种在问题的解空间树T上搜索问题解的算法.但在一般情况下,分支限界法与回溯法的求解目标不同.回溯法的求解目标是找出T ...
- Linux 系统的基本操作及工具的使用
基本操作命令如:useradd.userdel.passwd.su 添加用户.删除用户.修改密码.切换用户 ls.ll.cd.cp.mv.chmod ps.kil.man mkdir.touch.ta ...
- Excel催化剂图表系列之品味IBCS瀑布图观察企业利润构成
IBCS图表,每个细节都值得反复琢磨参悟,此篇给大家送上详尽的瀑布图方式下的利润数据观察.请不要拿Excel2016版提供的瀑布图与IBCS版的瀑布图作对比,那完全不是一个级别的,可以类比为拿一辆经济 ...
- ThreadLocal的使用场景:Web容器、Spring容器、日志打印
一.对于HTTP事务的理解 一次HTTP请求,就是一个事务.事务者,必须完整的执行其中的所有步骤,不能中断. 二.HTTP事务的隔离 每次HTTP请求对应一个HTTP事务,而每个请求都对应一个线程,线 ...