我有一个使用FreeMarker作为View技术的Spring
MVC应用程序(但是也许对我的问题来说,视图技术并不重要)。我需要拦截在请求期间可能引发的所有异常。
我已经实现了HandlerExceptionResolver,但是仅当控制器中发生异常时才执行此解析器。但是,当控制器返回ModelAndView且呈现视图时发生异常(因为未找到变量或类似的东西),则不调用异常解析器,而是在浏览器窗口中获取堆栈跟踪。
我还尝试在控制器中使用异常处理程序方法,该方法返回视图并使用@ExceptionHandler对其进行注释,但这也不起作用(很可能再次出现,因为异常不是在控制器中而是在视图中抛出)。
那么,是否有一些Spring机制可以注册捕获视图错误的异常处理程序?
一个简单的词:如果您只需要一个“静态”错误页面而没有太多的逻辑和模型准备,那么<error-page>
在您的页面中放置一个-Tag
就足够了web.xml
(请参见下面的示例)。
否则,可能会有更好的方法来执行此操作,但这对我们有用:
我们使用servlet
<filter>
中web.xml
,捕捉所有的异常,并调用我们自定义的ErrorHandler,春节HandlerExceptionResolver内的,我们使用。
<filter>
<filter-name>errorHandlerFilter</filter-name>
<filter-class>org.example.filter.ErrorHandlerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>errorHandlerFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
该实现基本上如下所示:
public class ErrorHandlerFilter implements Filter {
ErrorHandler errorHandler;
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
try {
filterChain.doFilter(request, response);
} catch (Exception ex) {
// call ErrorHandler and dispatch to error jsp
String errorMessage = errorHandler.handle(request, response, ex);
request.setAttribute("errorMessage", errorMessage);
request.getRequestDispatcher("/WEB-INF/jsp/error/dispatch-error.jsp").forward(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
errorHandler = (ErrorHandler) WebApplicationContextUtils
.getRequiredWebApplicationContext(filterConfig.getServletContext())
.getBean("defaultErrorHandler");
}
// ...
}
我相信这对于FreeMarker模板应该几乎一样。当然,如果您的错误视图引发错误,那么您或多或少就会失去选择。
为了也捕获404之类的错误并为其准备模型,我们使用映射到ERROR
调度程序的过滤器:
<filter>
<filter-name>errorDispatcherFilter</filter-name>
<filter-class>org.example.filter.ErrorDispatcherFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>errorDispatcherFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/jsp/error/dispatch-error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/WEB-INF/jsp/error/dispatch-error.jsp</location>
</error-page>
doFilter-Implementation如下所示:
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
final HttpServletRequest request = (HttpServletRequest) servletRequest;
// handle code(s)
final int code = (Integer) request.getAttribute("javax.servlet.error.status_code");
if (code == 404) {
final String uri = (String) request.getAttribute("javax.servlet.error.request_uri");
request.setAttribute("errorMessage", "The requested page '" + uri + "' could not be found.");
}
// notify chain
filterChain.doFilter(servletRequest, servletResponse);
}
我有下面的代码块。我得到的是的catch块没有处理它。有人能告诉我如何处理下面的块抛出的异常吗?
渲染某个变量 假定我们定义了一个变量: <script> export default { data () { return { my_value: '默认值', } }, } </script> 我们就可以这样来显示它: <div>{{my_value}}</div> 方法的声明和调用 声明一个方法: show_my_value <script> ex
Blade 内部内置了一个非常简单的模板渲染引擎,如果你有一些简单的页面需要渲染可以试试它(生产环境不适用)。 渲染一个模板需要遵守一条准则: 所有的模板文件都存储在 resources/templates 目录下 你可以调用 Response 方法的 render 方法渲染或者返回一个 String 类型的视图路径。 @GetRoute("/index") public void renderI
因为新版的控制器可以无需继承任何的基础类,因此在控制器中如何使用视图取决于你怎么定义控制器。 模板渲染 渲染模板最常用的是控制器类在继承系统控制器基类(\think\Controller)后调用fetch方法,调用格式: fetch('[模板文件]'[,'模板变量(数组)']) 模板文件的写法支持下面几种: 用法 描述 不带任何参数 自动定位当前操作的模板文件 [模块@][控制器/][操作] 常用
我正在使用Spring4和Tomcat。问题是有时我不得不在我的筛选器中抛出一个(自定义的)RuntimeException(控件甚至还没有到达控制器)。问题是,由于我没有抛出tomcat理解的异常,它被转换为500(内部服务器错误)。我相信403禁止会比500好(对于我的定制例外)。我查看了和注释。但只有当控件到达控制器时,这些才起作用。 到目前为止,我在筛选器的中将状态手动设置为403。有没有
我拥有的现有代码: 我想丰富现有代码,并在收到一些不允许的数据时引发异常,我做了以下更改: 但由于以下原因,我的实现甚至不可编译: 您能为我的特定场景提供建议吗?