我怎样才能捕捉到弹簧消息 JstTagException?

Posted

技术标签:

【中文标题】我怎样才能捕捉到弹簧消息 JstTagException?【英文标题】:How can I catch a spring message JstTagException? 【发布时间】:2011-12-04 17:01:49 【问题描述】:

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

<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:16,155 错误 [http-8080-2] RequestContextAwareTag - 在区域设置“ko_KR”的代码“BLAH”下找不到消息。 javax.servlet.jsp.JspTagException:在语言环境“ko_KR”的代码“BLAH”下找不到消息。 在 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(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) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 在 org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.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) 在 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) 在 org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:229) 在 org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250) 在 org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1047) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 在 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) 在 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) 在 org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968) 在 org.apache.jsp.WEB_002dINF.sitemesh_002ddecorators.main_jsp._jspx_meth_form_005fform_005f0(main_jsp.java:284) 在 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(JspServletWrapper.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) 在 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) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 在 org.apache.catalina.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) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 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) 在 org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) 在 org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 在 org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 在 java.lang.Thread.run(Unknown Source)

谢谢! 戴夫

【问题讨论】:

【参考方案1】:

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

如果您将the text attribute 设置为某个值,它会显示该值而不是抛出异常吗?

要清除异常,您可以为标记提供默认消息(MessageSource.getMessage(...) 方法具有采用此类defaultMessage 的重载)。

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

您可以通过使用MessageSource bean 上的UseCodeAsDefaultMessage 属性来做到这一点。请参阅here 和here。

【讨论】:

感谢您的帮助。但是,我使用的是动态属性,所以我需要在不存在键值时捕获它,或者提醒用户而不是显示空白页面。如果用户错误地设置了我的应用程序,例如,不小心删除了正在使用的键值对,它只会显示一个空白页面。我会将堆栈跟踪添加到原始帖子中。 @Dave:我已经根据您的评论更新了我的答案。看看有没有帮助。为了完整起见,我保留了部分初始答案。 谢谢!! UseCodeAsDefaultMessage 对我很有效!

以上是关于我怎样才能捕捉到弹簧消息 JstTagException?的主要内容,如果未能解决你的问题,请参考以下文章

我怎样才能捕捉到 404?

我怎样才能捕捉到视图变得可见

jquery的chosen控件,怎样才能捕捉到input的输入事件

如何用哨兵捕捉python警告?

保存子进程命令的错误信息

SpriteKit - 鼠标在 Sprite 拖动时捕捉到中心