Разграничете изгледа ‹error-page› от нормалния изглед във ViewHandler#createView()

Дефинирах страница за грешка в моя web.xml за грешка 404 по следния начин:

<error-page>
    <error-code>404</error-code>
    <location>/common/messages/pageNotFoundError.jsf</location>
</error-page>

Обработката на невалиден URL адрес на страница работи по предназначение - потребителят се пренасочва към страницата pageNotFoundError.

Също така дефинирах персонализиран манипулатор на изгледи в faces-config.xml. Манипулаторът на изглед отменя метода createView(FacesContext context, String viewId).

Сега е проблемът - когато страница съдържа графично изображение с невалиден път (което не мога да избегна, защото потребителите могат сами да дефинират пътища), методът createView се извиква два пъти. Веднъж с viewId = идентификатор на текущата страница (както очаквах) и веднъж с viewId = "/common/messages/pageNotFoundError.jsf". Има ли някакъв начин да се разграничи в метода createView "нормалното" създаване на страница от 404 (или всяка друга) обработка на грешки (не искам да сравнявам низове на viewId)? Или може би методът createView не трябва да се извиква в тази ситуация - в този случай въпросът ми е как да променя конфигурацията, за да постигна това?


person martaj    schedule 23.06.2015    source източник


Отговори (1)


Когато контейнерът на сървлета изпрати до страница за грешка, той ще зададе куп специални атрибути, свързани със страницата за грешка в текущата заявка за HTTP сервлет. Ключовете се идентифицират с тези ERROR_XXX постоянни стойности на полето в RequestDispatcher клас. Между другото, оригиналният URI на заявката, за която се изпраща страницата за грешка, е достъпен от ERROR_REQUEST_URI ключ. Ако това не е null, тогава знаете, че се изпраща страница за грешка и веднага имате под ръка оригиналния URI на заявката.

С други думи,

ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
String originalURI = (String) ec.getRequestMap().get(RequestDispatcher.ERROR_REQUEST_URI);

if (originalURI != null) {
    // An error page was dispatched for the given original URI.
} else {
    // We're most likely in the normal flow.
}
person BalusC    schedule 23.06.2015