Страница ошибок JSP создает ошибку JSP - PullRequest
2 голосов
/ 02 марта 2011

В моем веб-приложении spring-mvc есть страница с ошибкой, содержащая элемент трассировки складного стека (очевидно, опция разработки / отладки).Раньше он работал нормально, и отображал правильную трассировку стека от контроллера (или иногда от механизма JSP).

Q : возможно ли, чтобы JSP был страницей ошибокили это должен быть статический HTML?

Q : Что я делаю не так?

Цепочка событий (я думаю) управляется обработчиком ошибок, определенным вмой web.xml:

<error-page>
  <exception-type>java.lang.Throwable</exception-type>
  <location>/view/errors/internalError.jsp</location>
</error-page>

Где-то по пути (переключился на систему сборки maven, обновленный мол и пружина 2.5 -> 3.0), я заметил, что эта страница с ошибками перестала работать так, как была,Он отображает то же самое с одной проблемой - отображаемая трассировка стека исключений NOT из исключения, выданного в контроллере, но из самой страницы ошибки!

javax.servlet.ServletException: javax.servlet.jsp.JspTagException: 
500 /WEB-INF/jsp/admin/errors/internalError.jsp
    at org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:862)
    at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:791)
    at org.apache.jsp.WEB_002dINF.jsp.admin.defaultParent_jsp._jspService(defaultParent_jsp.java:225)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)

То, что кажетсяздесь происходит следующая цепочка событий:

  1. Контроллер Spring встречает неперехваченное исключение: throw new RuntimeException("no bananas")
  2. Это исключение перехватывается базой данных MultiActionController из пружин (так как нет специального обработчика ошибокопределено для этой страницы) исключение перебрасывается: только для повторного отслеживания в DispatcherServlet Spring.
  3. Затем DispatcherServlet просматривает что-то (возможно, мой web.xml), чтобы найти правильную страницу ошибки для типа исключения:
  4. Spring затем разрешает этот URL-адрес в представление (и мою ошибку JSP).) и пытается его отрендерить.
  5. Теперь здесь что-то идет не так с родительским jsp по умолчанию (* см. ниже), вызывая исключение JSP, которое на этот раз перехватывается ServletHolder в Jetty.Это исключение теперь отображается (через web.xml) на страницу ошибки JSP.
  6. Здесь вы можете подумать, что это приведет к бесконечному циклу.Тем не менее, во второй раз все работает нормально, и это выдает ошибку JSP.

Кажется, что JSP-ядро умирает при рендеринге родительского JSP по умолчанию - похоже, он сталкивается с проблемами в: org.apache.taglibs.standard.tag.common.core.ImportSupport.Я видел некоторые посты в Интернете, где люди говорят, что это связано с импортом из каталога WEB-INF.

// disallow inappropriate response codes per JSTL spec
if (irw.getStatus() < 200 || irw.getStatus() > 299) {
  throw new JspTagException(irw.getStatus() + " " + stripSession(targetUrl));
}

Хотя здесь выглядит, как будто любая ошибка HTTP 500 сломает ее.Но разве это не та ошибка, которую должна иметь страница ?

1 Ответ

2 голосов
/ 02 марта 2011

В: Возможно ли, чтобы JSP был страницей ошибок, или это должен быть статический HTML?

Это прекрасно.Это может быть даже сервлет или что-то в этом роде.Конечно, если в нем нет ошибок.

В: Что я делаю не так?

На вашей странице ошибки есть ошибка.Вы, очевидно, используете <c:import> на странице ошибки, чтобы включить фрагмент из /WEB-INF.Это запрещено, потому что это не публичный ресурс (честно говоря, я не помню, чтобы он работал в древних версиях JSTL).Скорее используйте <jsp:include>.

...