在项目中,我们会对入参做校验,这些参数的校验逻辑我们会写很多次.能不能将这些参数的校验逻辑提出来呢?答案是可以.Spring 有自己的validate工具方法,我个人感觉不是太好远,想自己定制更加契合自己项目的校验机制.经过哆哆嗦嗦的研究,有点结果,现在贴出来,大家一起看看!
我曾经写过一个工具类,就是会在Service层的方法上加上自定义的注解,利用Spring aop拦截标注注解的方法,如果有缓存就返回缓存,如果没有,则会从数据库取出或者重新计算,
以达到提高吞吐率.实践证明还是挺好用的.
经过以上描述,我们今天的关键词就有了,就是:Spring,Spring MVC,Spring AOP,java反射,java注解
一,Controller的拦截
一般的,我们项目中bean的管理和mvc的配置是分开的,之前轻松的给service层加上了aop切面,但是用之前的方法发现不好使.为什么?因为Controller是归mvc层管理的,按照原来的方法,根本拦截不到controller的方法.
1,将切面配置在spring 的bean.xml中,需要协调Controller注解(以后我再补上原因)
2,将切面配置在spring 的mvc.xml中,这样不用协调Controller注解.
<bean id="validateAdvitor" class="com.test.rest.api.web.validators.ParamValidateAdvisor"/>
<aop:config proxy-target-class="true">
<aop:aspect ref="validateAdvitor">
<aop:pointcut expression="@annotation(com..rest.api.web.validators.annos.Validate)" id="validateCut"/>
<aop:around method="validate" pointcut-ref="validateCut"/>
</aop:aspect>
</aop:config>
二,Advisor
package com.test.rest.api.web.validators;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.test.common.enums.ErrorCode;
import com.test.framework.common.util.Check;
import com.est.rest.api.util.ResponseUtil;
import com.test.rest.api.web.validators.annos.Must;
import com.test.rest.api.web.validators.annos.Validate;
/**
* 参数验证
* @author michael.bai
* @date 2016年12月20日
*/
public class ParamValidateAdvisor{
private Logger logger = LoggerFactory.getLogger(ParamValidateAdvisor.class);
/**
* 校验入参
* @param point
* @throws Throwable
*/
public Object validate(ProceedingJoinPoint point) throws Throwable{
logger.info("开始拦截接口入参!");
Object[] objs = point.getArgs();
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();
//检测
Annotation