已解决java.lang.IllegalStateException: No MethodInvocation found: Check that an AOP invocation
来源:互联网 发布:小米手机网络类型选择 编辑:程序博客网 时间:2024/06/02 03:36
在抛出异常后通知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!
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>
<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("}");
}
}
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);
}
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注解-->
<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("}");
}
}
@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配置的切面编程就无法实现呢?欢迎大神解答,多谢!
1 0
- 已解决java.lang.IllegalStateException: No MethodInvocation found: Check that an AOP invocation
- java.lang.IllegalStateException: No match found 的分析解决
- java.lang.IllegalStateException: No match found错误
- java正则总是:java.lang.IllegalStateException: No match found 的分析解决
- java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered?
- java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered
- javax.servlet.ServletException: java.lang.IllegalStateException: No WebApplicationContext found: no
- java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered
- 【已解决】java.lang.IllegalArgumentException: No converter found for return value of type: class java.uti
- java.lang.IllegalStateException解决
- 解决:java.lang.UnsatisfiedLinkError: No implementation found
- java.lang.IllegalStateException: No activity
- java.lang.IllegalStateException: No activity
- java.lang.IllegalStateException: No activity
- java.lang.IllegalStateException: No activity
- java.lang.IllegalStateException: No activity
- java.lang.IllegalStateException: No activity
- java.lang.IllegalStateException: No host
- IOC学习笔记
- android5.1简单测试在app中使用jni的库来调用串口设备
- ESXi服务器上利用Fuel部署Openstack错误解决
- 上传文件实现数据采集以及批量导入数据库实例
- static class 静态类(Java)
- 已解决java.lang.IllegalStateException: No MethodInvocation found: Check that an AOP invocation
- ANDROID STUDIO LIVE TEMPLATES
- spring配置文件学习笔记
- 关于ipa包上传到AppStore时错误汇总(持续更新)
- 实现ajax提交表单,页面不跳转
- 策略模式(java设计模式)
- 机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)
- C#各种配置文件使用,操作方法总结
- mac下安装与配置MySQL