今天遇到一个问题,并不是技术上很牛逼,只是有一点灵异,如何灵异的呢?因为我第一次部署测试没有反应,但是当我实在是hold不住,调试spring mvc源码的时候,它悄悄的,竟然好了。。。。。由此而产生的最直接后果是,当第一次我测试失败后,我直接否定了这个方案转而尝试其他方案,结果导致了我浪费了很多时间。。。。。
个中蛋疼问题,心力憔悴之处暂且不表,言归正传。
应用场景:
Spring MVC中拦截器拦截项目中的Exception,这很正常,不正常的是,要求在拦截这个异常的时候记录下发生异常的方法名,参数,在Spring MVC的拦截器中我们实现了HandlerExceptionResolver,重写的方法为public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {}
在这里我只拿到Exception的信息,而无法直接得知出错的方法名和出错时的参数。
因为Spring MVC的容器和Spring Core的容器不是同一个,这个问题的关键,我无法直接获取我想要的信息,好吧,为了我那可怜的工资,我辈只能奋不顾身。
PS :因为一些信息的原因,有些敏感字符也删除,各位勿喷。
首先:定义一个AOP,先写一个简单的Class,
public class ExceptionAdvisor{
public void afterThrowing(JoinPoint joinPoint, Exception ex) {
Method method = ((MethodSignature)joinPoint.getSignature()).getMethod();
Object[] args = joinPoint.getArgs();
String methodName = method.getName();
StringBuilder builder = new StringBuilder(512);
builder.append("\nMethod Name is :").append(methodName).append("\n");
if (args != null) {
int size = args.length;
builder.append("Method Args:\n");
for (int index = 0; index < size; index ++) {
Object object = args[index];
builder.append("args[").append(index).append("]:").append(object.toString()).append("\n");
}
}
builder.append(ex.getMessage());
throw new RuntimeException(builder.toString());
}
}
注意上述的做法是,先把我需要的信息拼装起来,然后重新throw一个RuntimeException
同样的,上配置文件:
<bean id="exceptionadvice" class="com.playsnail.platform.exception.handler.ExceptionAdvisor" />
<aop:config proxy-target-class="true">
<aop:aspect ref="exceptionadvice" >
<aop:after-throwing method="afterThrowing" pointcut="execution (* 路径..*.*(..))" throwing="ex"/>
</aop:aspect>
</aop:config>
这样便拦截到了Spring core里面的异常。
当我们throw新的RuntimeException后,就需要Spring MVC的拦截器闪亮登场。
public class ExceptionHandler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
//此处的Exception就是AOP重新抛出的Exception了,现在对重新抛出的异常做你想做的事情
return new ModelAndView();
}
同样的,不能少了配置文件,在spring MVC的配置文件中增加
<bean id="exceptionResolver" class="路径.ExceptionHandler "></bean>
OK, 简单吧,但是摸索的过程是痛苦的,特别有一些灵异事件以后。
上面是milestone版,后期可能会出现一些变动,还需要实践的证明,各位看官有什么指正之处或者有什么更好的办法,欢迎各位狂喷。
相关推荐
Spring AOP 拦截器 Advisor Spring AOP 拦截器 Advisor
springboot spring aop 拦截器 注解方式实现脱敏(涉及到:pom.xml -->application.properties --->启动类-->拦截器)
springaop拦截controller日志
spring aop切面拦截指定类和方法实现流程日志跟踪 一般情况下,在不侵入业务代码的情况下,需要做流程日志跟踪是比较合理的 采用springaop切面思想
项目中含有一整个springboot实现aop的功能,在拦截的方法形式上有两种一种是通过切点设置为拦截某个包路径下面的类中的所有方法;还有一种是基于某个自定义注解的.
Spring Mvc AOP通过注解方式拦截controller等实现日志管理
spring aop 拦截实例,下载下来直接就可以用了,很好很方便。
本篇文章主要介绍了详解Spring AOP 拦截器的基本实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序
spring aop 拦截 实例spring aop 拦截 实例spring aop 拦截 实例
spring aop 拦截系统操作日志和异常日志,存储到数据库中的全过程
用spring写的小示例程序,拦截某一层的所有方法。可以在调用之前、之后、抛出异常拦截调用,日志打印。
Spring MVC AOP通过自定义注解方式拦截Controller等实现日志管理, springMVC里做添加AOP拦截,用于捕获异常。
非常简单的aop例子,可以从该离子出发隐身出很多其他的问题的思考。
spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop
spring aop jar 包
spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...
ssh2登陆+spring aop做拦截
Spring AOP四种创建通知(拦截器)类型
Spring 实现AOP需要三个第三方的jar包,分别是aspectjrt.jar,aspectjweaver.jar,aopalliance-1.0.jar