最新项目有个新需求,要在已经写好的controller里面 加上传入参数的验证,由于有多个 controller而且验证每个都要调用其他的服务,故决定采用spring的aop方式。
1.添加aop的验证
@Component @Aspect public class VerifyCircle { private Logger logger = LoggerFactory.getLogger(this.getClass()); public static final String shequnHost=SystemProperties.getInstance().getProperty("community.rpc.url"); @Pointcut("execution(* cn.zm518.vip.action.ProductController.rmberTypeDetail(..))") public void pointCut(){ } @Before("pointCut()") public void verifyCircle(JoinPoint joinPoint){ System.out.println(joinPoint.getSignature().getName() + "传的参数是:{" + Arrays.asList(joinPoint.getArgs())+"}"); String circleId = ""; if (StringUtils.isBlank(circleId)){ logger.info("circleId 为空!!!"); } CircleClient circleClient = CircleClient.getInstance(shequnHost); } /*@After("") public void finish(){ }*/ /* @AfterThrowing(value = "pointCut()",throwing = "ex") public void verifyException(Exception ex){ logger.debug("检查异常.... 异常信息是:{" + ex + "}"); }*/ }
2.配置文件
注意要在spring-mvc的xml文件里面添加,而不是applicationContext.xml文件添加。网上查找原因说是,applicationContext.xml被spring的ContextLoaderListenerClass加载为WebApplicationContext,此为一个父上下文,而加载spring-mvc是Dispatch-servlet,
此为一个子上下文。如果配置在applicationContext.xml,相当于在父上下文中配置,父上下文无法访问子上下文。
<!--开启aop注解 -->
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
3.启动tomcat 验证。。。 结果不行。
自己原因主要是:
@Pointcut("execution(* cn.zm518.vip.action.ProductController.rmberTypeDetail(..))") ,一个自己配置某个方法时候,写成了public void cn.zm518.vip.action.ProductController.rmberTypeDetail() ,但是自己的controller里面是返回的ModelAndView视图
,第二个问题是 自己的方法带有参数,但自己写的是无参数的。所以一直不行。。。