在抛出异常后,切面通知AfterThrowing捕获过异常,Controller就无法捕获Service抛出的异常类型,但可以捕获Exception或Throwable,获取异常信息提示如下:
java.lang.IllegalStateException: No MethodInvocation found: Check that an AOP invocation is in progress,
and that the ExposeInvocationInterceptor is upfront in the interceptor chain. Specifically,
note that advices with order HIGHEST_PRECEDENCE will execute before ExposeInvocationInterceptor! 

当切点service方法抛出异常后,切面类LogInterceptor 的throwing方法会正常执行,但Controller里却无法捕获ValidateException 异常,通过捕获Exception异常后,报出文上错误信息,经查看源码发现,是源码ExposeInvocationInterceptor类中抛出了新异常IllegalStateException,源码如下:

spring配置如下:
<bean id="logInterceptor" class="xx.xxx.xxx.LogInterceptor"></bean>
<aop:config><aop:aspect id="logAspectSYS" ref="logInterceptor" order="1"><aop:after-throwing method="throwing" throwing="ex" pointcut="execution(public * xx.xxx.xxx..*.*(..))" /></aop:aspect>
</aop:config>

切面类如下:

public class LogInterceptor {static Log logger = LogFactory.getLog(LogInterceptor.class);public void throwing(JoinPoint joinPoint, Throwable ex) {StackTraceElement[] stack =  ex.getStackTrace();logger.error("异常信息:" + (ex.getMessage() == null ? "" : ex.getMessage()));  logger.error("{");logger.error("\t" + ex.getClass().getName());for(int i = 0; i < stack.length; i++){logger.error("\t" + stack[i]);}logger.error("}");}
}

Service切点方法如下:

public int saveFinancialPlan(String applyIds,Double amount,Integer days,Double    interest,Integer raiseDays,Integer releaseType,Date releaseTime)  throws ValidateException{throw new ValidateException("发生异常了");
}

Controller方法如下

@RequestMapping(value = "saveFinancialPlan")
public @ResponseBody OperateResult saveFinancialPlan(String applyIds,Double amount,Integer days,Double interest,Integer raiseDays,Integer releaseType,Date releaseTime, Model model){try {financePlanService.saveFinancialPlan(applyIds,amount,days,interest,raiseDays,releaseType,releaseTime);} catch (ValidateException e) {return new OperateResult(OperateResultType.Error,e.getMessage());}return new OperateResult(OperateResultType.Success);
}

研究很久也没弄清原因。可以肯定,配置方面没有问题。

但,问题总要解决啊,抱着试试的态度,居然奇迹般的解决了。解决办法就是,去掉所有xml配置的切面编程,改用AspectJ注解的方式。具体如下
xml配置:
<context:component-scan base-package="xx.xx.xxx" />  <!--扫描所有注解的包-->
<aop:aspectj-autoproxy/>                             <!--打开aop注解-->   

切面类如下:

@Component
@Aspect
public class LogInterceptor {static Log logger = LogFactory.getLog(LogInterceptor.class);@Pointcut("execution(public * xx.xxx.xxx..*.*(..))")public void pointcut(){}@AfterThrowing(pointcut = "pointcut()",throwing = "ex")public void throwing(JoinPoint joinPoint, Throwable ex) {StackTraceElement[] stack =  ex.getStackTrace();logger.error("异常信息:" + (ex.getMessage() == null ? "" : ex.getMessage()));  logger.error("{");logger.error("\t" + ex.getClass().getName());for(int i = 0; i < stack.length; i++){logger.error("\t" + stack[i]);}logger.error("}");}
}

如此,就解决了问题,再也没有报上文的错误,切面类也很好的实现了功能。

但,为什么xml配置的切面编程就无法实现呢?欢迎大神解答,多谢!
补充:
多年以后回看这个问题,觉得那个时候的自己果然很菜啊,究其原因,是xml配置里的order="1"引起的。去掉就好了。
<aop:aspect id="logAspectSYS" ref="logInterceptor" order="1">

切面捕获异常后,controller无法捕获,java.lang.IllegalStateException: No MethodInvocation found: Check that an AOP相关推荐

  1. IDEA热布署报错java.lang.IllegalStateException: Restarter has not been initialized

    在IDEA导入devtools依赖实现热布署,启动后遇到如下问题 java.lang.IllegalStateException: Restarter has not been initialized ...

  2. java.lang.IllegalStateException: getOutputStream() has already been called for this response

    在做报表导出的时,导出报表后服务器提示: java.lang.IllegalStateException: getOutputStream() has already been called for ...

  3. java.lang.IllegalStateException: 提交响应后无法转发

    java.lang.IllegalStateException: 提交响应后无法转发 resp.sendRedirect("/login.jsp"); req.getRequest ...

  4. java铃声类_MediaPlayer.setDataSource中的java.lang.IllegalStateException,使用铃声类

    我有一个用户(Samsung Galaxy S5,Android 4.4)报告的崩溃,我不明白发生了什么.这似乎是可以吸收的,但也许有些人遇到了同样的问题,或类似的问题.MediaPlayer.set ...

  5. java.lang.IllegalStateException: No instances available for eurekaclient

    在测试ribbon负载均衡的时候,遇到一个这个报错: Servlet.service() for servlet [dispatcherServlet] in context with path [] ...

  6. 批量下载的实现及java.lang.IllegalStateException异常

    在工作流的一张表单里可能会有多个步骤上传附件,在用户的待办中往往会存在多条带有附件的任务,如果一一打开并且点击下载链接下载,不仅费时,而且繁琐,用户体验较差. OA系统采用的是FastDFS做为文件服 ...

  7. ES failed to notify ClusterStateListener java.lang.IllegalStateException: environment is not locked

    ES出现异常: failed to notify ClusterStateListener java.lang.IllegalStateException: environment is not lo ...

  8. java.lang.IllegalStateException: Context namespace element ‘annotation-config’ and its parser class

    项目中用的是spring低版本(2.5.6),今天用jre 8测试了一下,发现错误: Unexpected exception parsing XML document from class path ...

  9. 解决IntelliJ IDEA报错:调用方法[manageApp]时发生异常java.lang.IllegalStateException: 启动子级时出错

    解决IntelliJ IDEA报错:调用方法[manageApp]时发生异常java.lang.IllegalStateException: 启动子级时出错 问题描述:   笔者将一个在 Tomcat ...

最新文章

  1. 一个“复制/删除”方式的滚动
  2. MariaDB 宣布成立基金会
  3. 深度学习 CNN卷积神经网络 LeNet-5详解
  4. 五个角度,来梳理下产品经理的分类和职业发展方向
  5. bzoj4820[SDOI2017]硬币游戏
  6. 低智商屌丝蒟蒻的2012成都题解
  7. 欧姆龙rxd指令讲解_欧姆龙PLC指令表
  8. CorelDRAWX4的VBA插件开发(七)形状的静态编号和一键转位图
  9. HTML框架分析及应用
  10. Linux系统安全及应用详解
  11. 技术指南 | 理解零知识证明算法之Zk-stark
  12. ftp服务器限制文件大小,ftp服务器设置文件大小
  13. java seek_java中seek()的用法
  14. JAVA 数组降序排列思路
  15. scala编译常见错误
  16. SPSS是什么?SPSS软件的功能有哪些?
  17. 原神android和苹果,原神安卓苹果数据互通吗
  18. [转]oracle EBS 基础100问
  19. Android Tapjacking
  20. 基于主成分分析的人脸识别及表情识别

热门文章

  1. HTTP报文之请求报文和响应报文详解
  2. FOP XSL中文自动换行
  3. Windows虚拟wifi配置
  4. 年薪100w+的阿里p7专家,顶尖的技术人才,只因做到了这几点
  5. 移动硬盘和u盘连接计算机,电脑文件自动复制到U盘或移动硬盘,当它们插入电脑时...
  6. 声艺fx16调音台怎么样_声艺(Soundcraft) FX16Ⅱ(RW5757)16路/2立体声 专业调音台
  7. iMacros 自动发文章和外链的做法
  8. 爱派ipad服务器停止响应,ipad死机了怎么办 ipad死机怎么重启方法【详解】
  9. Laravel Debugbar
  10. 500左右的耳机哪款降噪最好?500左右降噪最好的耳机推荐