spring aop拦截Controller做参数校验

本文探讨如何将重复的参数校验逻辑提取出来,通过Spring AOP在Controller层进行拦截,以实现更灵活的校验机制。文章介绍了在Spring MVC项目中,由于Controller归属MVC层管理,所以需要特别的配置才能实现切面拦截,并分享了使用自定义注解配合Java反射和注解的实践经验。
摘要由CSDN通过智能技术生成

       在项目中,我们会对入参做校验,这些参数的校验逻辑我们会写很多次.能不能将这些参数的校验逻辑提出来呢?答案是可以.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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值