2011-10-10 99 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