package com.beebunny.springapp.exception.resolvers;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;
public class MyExceptionResolver extends SimpleMappingExceptionResolver {
private static final String ERROR_PAGE = "path/to/error/page.html";
@Override
protected ModelAndView doResolveException(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) {
ModelAndView mav = new ModelAndView(ERROR_PAGE);
return mav;
}
}
我有一个 Controller ,我编写它只是为了抛出异常。我期望上面的类能够触发其 doResolveException 。我需要在这里做一些事情,例如日志记录、调用 API 和一些其他自定义处理。
不幸的是,我正在使用的 Spring 版本不支持 @ControllerAdvice,因此我又回到了 SimpleMappingExceptionResolver。
我的要求是,我需要一个异常处理程序,如果由于任何原因发生问题,该处理程序将捕获任何未捕获的异常。
不确定导致此功能不起作用的常见原因是什么。
我确实在我的 bean 配置中定义了 context:component-scan,其中包含上面的异常处理程序实现的包。
编辑:这是我的 bean 配置中的相关行:
<context:component-scan base-package="com.beebunny.springapp"/>
最佳答案
解决方案有两个。
- 我需要将 @Component 注释添加到 MyExceptionResolver 类中,该类扩展了 SimpleMappingExceptionResolver。感谢 Bohuslav Burghardt 在评论中指出了这一点。
- 在我的 beanconfig 中,我依靠 context:component-scan 来获取我的 @Component 注解类并正常工作。
相反,我必须向 MyExceptionResolver 添加一个属性,并在 Spring 配置中显式指定此 bean。因此,我向 MyExceptionResolver 添加了此属性。
private int order;
然后,正如我所说,我必须显式定义此 bean,并且必须手动指定此 order 属性的值,如下所示:
<bean id="exceptionResolver" class="com.beebunny.springapp.exception.resolvers.MyExceptionResolver">
<property name="order" value="0"/>
</bean>
换句话说,我的项目有一个默认的异常解析器,我只需要覆盖异常解析器的使用顺序。
关于java - SimpleMappingExceptionResolver 中的 Spring doResolveException 未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33976552/