2011-10-10 101 views
3

我使用Spring MVC 3.0与sitemesh和spring消息包。例如,我有以下几点:如何捕捉弹出消息JstTagException?

<spring:message code="nav.item.name"/> 

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

<fmt:message key="nav.item.name"/> 

并且视图显示页面,但带有“???????”为文本。这实际上对我来说至少可以显示页面,但我宁愿使用spring:message标记。

我的问题是:如何抓住JspTagException?

堆栈跟踪:

2011-10-12 09:31:16155 ERROR [HTTP-8080-2] RequestContextAwareTag - 无下代码 'BLAH' 找到的区域设置 'ko_KR' 消息。 javax.servlet.jsp.JspTagException:没有下代码“BLAH”的区域“ko_KR”找到的消息。 在org.springframework.web.servlet.tags.MessageTag.doStartTagInternal(MessageTag.java:184) 在org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:79) 在org.apache。 jsp.WEB_002dINF.pages.common.nav_jsp._jspx_meth_spring_005fmessage_005f0在org.apache.jsp.WEB_002dINF.pages.common.nav_jsp._jspService(nav_jsp.java:114)(nav_jsp.java:206) 在org.apache.jasper。 runtime.HttpJspBase.service(HttpJspBase.java:70) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:386) 在org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) 在org.apache.jasper.servle (javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 在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) at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:488) at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java: 229) at org.springframework.web.servlet.view.AbstractV在org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817)上的org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1047) 在org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 在org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 在org.springframework.web.servlet。在org上,javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 上的FrameworkServlet.doGet(FrameworkServlet.java:549) (javax.servlet.http.HttpServlet.service(HttpServlet.java:617) )。 apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 在org.apache.catalina.core.ApplicationFilterChain。在org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551) at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:488) 在org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968) 在org.apache.jsp.WEB_002dINF.sitemesh_002ddecorators。 main_jsp._jspx_meth_form_005fform_005f0在org.apache.jsp.WEB_002dINF.sitemesh_002ddecorators.main_jsp._jspService(main_jsp.java:138)(main_jsp.java:284) 在org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java: 70) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:386) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) at 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 org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646) at org.apache.catalina.core.ApplicationDispatcher。 doInclude(ApplicationDispatcher.java:551) at org.apache.catalina.core.Applica tionDispatcher.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) 处org.apache.catalina org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 。 core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113) 在org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter。 java:76) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core。 StandardWrapperValve.invoke(StandardWrapperValve.java:233) 在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(StandardEngineValve.java:109) 在org.apache.catalina.connector。 CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apach e.coyote.http11.Http11Processor.process(Http11Processor.java:859) at org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:588) at org.apache.tomcat.util.net。 JIoEndpoint $ Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Unknown Source)

谢谢! Dave

回答

4

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

如果设置the text attribute一定值时,它表明值,而不是抛出异常的?

要清除例外情况,您可以为标签提供一条默认消息(MessageSource.getMessage(...)方法有一个超载需要这样一个defaultMessage)。

如果你没有默认显示,但仍然要警告用户丢失键(而不是抛出异常或白页),为什么不显示实际丢失的code

您可以使用MessageSource bean上的UseCodeAsDefaultMessage属性来完成此操作。见herehere

+0

感谢您的帮助。不过,我使用的动态属性,所以我需要在没有键值的存在是为了将其接住或提醒用户,而不是显示一个空白页。如果用户错误地设置我的应用程序,例如,意外删除正在使用的键值对,它将只显示一个空白页面。我会将堆栈跟踪添加到原始帖子。 – Dave

+0

@戴夫:我已经更新了基于您的评论我的回答。看看它是否有帮助。为了完整性,我保留了部分初始答案。 – 2011-10-12 20:29:21

+0

谢谢!! UseCodeAsDefaultMessage适用于我! – Dave