Скрыть JSP от FacesContext - PullRequest
       30

Скрыть JSP от FacesContext

1 голос
/ 24 октября 2011

У меня есть приложение JSF с сервлетом Filter, настроенное для urlPattern /faces/*. Я хочу скрыть JSP от контекста лиц, чтобы он не проходил через сервлет Filter. Поэтому я сохранил его в папке WebContent моего проекта как WebContent/Error.jsp и объявил в web.xml следующее:

<error-page>
    <exception-type>java.lang.NullPointerException</exception-type>
    <location>/Error.jsp</location>
</error-page>

Но мой Error.jsp никогда не будет поднят. Вместо этого я вижу ошибку 404 Страница не найдена.

Чтобы быть более понятным, я хочу, чтобы URL моей Error.jsp страницы был:

http://localhost:8080/myappname/Error.jsp

Но это достижимо только:

http://localhost:8080/myappname/faces/Error.jsp

То же самое имеет место, когда я объявляю любое view-id в faces-config.xml. Где я могу сохранить ошибку JSP, если я хочу скрыть ее от faces контекста?

Ответы [ 3 ]

0 голосов
/ 24 октября 2011

Мне кажется, что фильтр Faces не имеет никакого отношения к этой проблеме. Можете ли вы достичь http://localhost:8080/myappname/Error.jsp с полностью отключенным фильтром? Если нет, то, возможно, есть проблема с самим файлом Error.jsp?

Трудно сказать, не видя сам код.

0 голосов
/ 24 октября 2011

Судя по приведенной информации, все выглядит так, как будто все должно работать нормально. У вас нет <dispatcher>ERROR</dispatcher> на фильтре, поэтому фильтр вообще не должен вызываться при броске NPE.

Очевидно, что NPE был заключен в другое исключение, потому что он был брошен в нелогичное место, такое как конструктор бина, вместо обычного метода действия бина. В таком случае JSF выбросит его как ManagedBeanCreationException. Контейнер получит его вместо NPE и, следовательно, не сможет найти страницу с ошибкой. На странице ошибок HTTP 500 по умолчанию контейнера следует прочитать самое верхнее исключение трассировки стека, чтобы определить правильное исключение для определения страницы ошибки.

Имейте в виду, что исключения времени выполнения, такие как NPE, являются ошибками разработчика (ошибками!), А не производственными ошибками, и что они должны быть исправлены как можно скорее. Лично я бы просто использовал глобальную страницу ошибок HTTP 500 для такого рода ошибок:

<error-page>
    <status-code>500<status-code>
    <location>/errors/generic.jsp</location>
</error-page>

Для более конкретных, реальных производственных исключений вы всегда можете объявить более конкретную страницу ошибки:

<error-page>
    <exception-type>com.example.YourDatabaseAccessException</exception-type>
    <location>/errors/database.jsp</location>
</error-page>
<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/errors/sessionexpired.jsp</location>
</error-page>
0 голосов
/ 24 октября 2011

Если вы определите фильтр и заявите, что в вашем файле web.xml весь запрос будет проходить через этот фильтр, если только вы не определите отображение фильтра.

Я думаю, что вы можете определить отображение фильтра в своей сети..xml следующим образом:

<filter> 
<filter-name>URLFilter</filter-name> 
<filter-class>the filter class in your source code</filter-class> 
</filter> 
<filter-mapping> 
<filter-name>URLFilter</filter-name> 
<url-pattern>/some pages</url-pattern>//skip error.jsp here
</filter-mapping> 

это не проверено, а просто вдохновение.редактировать: вы можете узнать больше на сайте Oracle

...