如何捕获Spring消息JstTagException?

Dav*_*ave 5 spring localization exception-handling spring-mvc sitemesh

我正在使用带有sitemesh和spring消息包的Spring MVC 3.0.例如,我有以下内容:

<spring:message code="nav.item.name"/>
Run Code Online (Sandbox Code Playgroud)

如果我的资源文件中不存在nav.item.name,我在控制台中收到一个空白页面和一个JspTagException,我无法用我的@ExceptionHandler方法捕获它.我假设我无法捕捉它,因为错误是视图渲染的一部分.我还试图创建一个自定义HandlerInterceptorAdapter,并修改web.xml,但没有成功.有趣的是,我还使用了以下标记:

<fmt:message key="nav.item.name"/>
Run Code Online (Sandbox Code Playgroud)

视图显示页面,但带有"???????" 对于文本.这实际上对我至少可以显示页面更容易接受,但我宁愿使用spring:message标签.

我的问题是:我如何捕获JspTagException?

堆栈跟踪:

2011-10-12 09:31:16,155 ERROR [http-8080-2] RequestContextAwareTag - 在代码'BLAH'下找不到区域设置'ko_KR'的消息.javax.servlet.jsp.JspTagException:在代码'BLAH'下找不到区域设置'ko_KR'的消息.在Org.apache.jache.jEB_002dINF的org.springframework.web.servlet.tags.MessageTag.doStartTagInternal(MessageTag.java:184)org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:79) .pages.common.nav_jsp._jspx_meth_spring_005fmessage_005f0(nav_jsp.java:206)org.apache.jsp.WEB_002dINF.pages.common.nav_jsp._jspService(nav_jsp.java:114)org.apache.jasper.runtime.HttpJspBase.service (HttpJspBase.java:70)位于org.apache.jasper的org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:386)的javax.servlet.http.HttpServlet.service(HttpServlet.java:717).位于org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)的servlet.JspServlet.serviceJspFile(JspServlet.java:313)位于org的javax.servlet.http.HttpServlet.service(HttpServlet.java:717) .apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:20 6)org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551)atg.apache.catalina.core.ApplicationDispatcher .include(ApplicationDispatcher.java:488)位于org.springframework.web.servlet.view.AbstractView.render上的org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:229)(AbstractView.java:250 )org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1047)位于org.springframework.web.servlet.DispatcherServlet的org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817).位于org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)的doService(DispatcherServlet.java:719)位于org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)的javax.servlet上javax.ser上的.http.HttpServlet.service(HttpServlet.java:617)位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)的vlet.http.HttpServlet.service(HttpServlet.java:717)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 206)org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551)atg.apache.catalina.core.ApplicationDispatcher .include(ApplicationDispatcher.java:488)org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)at org.apache.jsp.WEB_002dINF.sitemesh_002ddecorators.main_jsp._jspx_meth_form_005fform_005f0(main_jsp.java:284)at org.apache.jsp.WEB_002dINF.sitemesh_002ddecorators.main_jsp._jspService(main_jsp.java:138)位于org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)的javax.servlet.http.HttpServlet.service( HttpServlet.java:717)org.apache.jasper.servlet.JspServletWrapper.service(JspS)ervletWrapper.java:386)org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)位于org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)的javax.servlet.http .httpServlet.service(HttpServlet.java:717)位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551)org.apache.catalina.core.ApplicationDispatcher.include( ApplicationDispatcher.java:488)com.opensymphony.sitemesh.compatability.OldDecorator2NewDecorator.render(OldDecorator2NewDecorator.java:46)com.opensymphony.sitemesh.webapp.decorator.BaseWebAppDecorator.render(BaseWebAppDecorator.java:33)com.opensymphony .sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:84)at或 g.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)位于org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter的org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206). dogilterInternal(OpenEntityManagerInViewFilter.java:113)位于org.apache的org.apache.catal.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) .catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java) :191)org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)org.apache.catalina.core. StandardEngineValve.invoke(Standa rdEngineValve.java:109)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)org.apache.coyote .http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:588)atg.apache.tomcat.util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:489)at java.lang.Thread.run(Unknown Source)

谢谢!戴夫

小智 5

您不能使用Spring的异常处理机制,因为它在调用中更高.JSP异常稍后发生.

如果text属性设置为某个值,它是否显示该值而不是抛出异常?

要清除异常,您可以为标记提供默认消息(MessageSource.getMessage(...)方法具有过载这样的过程defaultMessage).

如果您没有默认显示但仍想警告用户缺少键(而不是抛出异常或白页),为什么不显示实际缺失code

您可以通过使用bean UseCodeAsDefaultMessage上的属性来实现MessageSource.看到这里这里.