Прежде всего, наша конфигурация:
- WildFly 14.0.1. Финал
- Мохарра 2.3.5.SP2
- OmniFaces 3.2
- PrimeFaces 6.2
Описание проблемы:
Мы используем OmniFaces FullAjaxExceptionHandler
для отображения страницы ошибок при запросах AJAX.
Соответствующий web.xml
:
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/errorpages/unexpectedError.xhtml</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/WEB-INF/errorpages/unexpectedError.xhtml</location>
</error-page>
<error-page>
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/WEB-INF/errorpages/loginExpired.xhtml</location>
</error-page>
<error-page>
<exception-type>javax.el.MethodNotFoundException</exception-type>
<location>/WEB-INF/errorpages/unexpectedError.xhtml</location>
</error-page>
У нас было несколько ситуаций, когда происходило что-то довольно редкое.Теперь мы создали тестовую ситуацию с выражением EL, вызывающим несуществующий метод, который не существует, просто для запуска MethodNotFoundException
при входе в систему.
Relevant login.xhtml
:
<p:someComponent ...
action="#{authenticator.thisMethodDoesNotExist()}"
... />
Это страница ошибки, которую мы хотим отобразить, расположенная по адресу /WEB-INF/errorpages/unexpectedError.xhtml
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:pa="http://primefaces.org/avalon"
template="/WEB-INF/templating/thinTemplate.xhtml">
<ui:define name="metadata">
</ui:define>
<ui:define name="resources">
</ui:define>
<ui:define name="title">
<h:outputText value="Unerwarteter Fehler" />
</ui:define>
<ui:define name="content">
<div class="ui-fluid">
<div class="ui-g">
<div class="ui-g-12 no-padding">
<div class="background-error-login-failed max-width-100">
</div>
<h:form id="content-form"
class="mt-50px mb-50px">
<div class="max-width-content ml-auto mr-auto">
<h1>Unerwarteter Fehler</h1>
<p>
Leider ist ein unerwarteter Fehler aufgetreten.
</p>
<p>
Bitte versuchen Sie, sich erneut anzumelden.
</p>
<p:link value="Zur Startseite"
outcome="..." />
</div>
</h:form>
</div>
</div>
</div>
</ui:define>
</ui:composition>
/WEB-INF/templating/thinTemplate.xhtml
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:pa="http://primefaces.org/avalon">
<f:view encoding="UTF-8"
locale="de_DE">
<ui:insert name="metadata" />
<h:head>
<title>
<ui:insert name="title" />
</title>
<ui:include src="resources.xhtml" />
<ui:insert name="resources" />
</h:head>
<h:body>
<ui:include src="thinHeader.xhtml" />
<div class="layout-main">
<ui:insert name="content" />
</div>
<ui:include src="./footer.xhtml" />
</h:body>
</f:view>
</html>
/WEB-INF/templating/resources.xhtml
(ссылка на thinTemplate.xhtml h: head):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:outputStylesheet library="global-mixins" name="css/application.css" />
<h:outputStylesheet library="global-mixins" name="css/borders.css" />
<h:outputStylesheet library="global-mixins" name="css/colors.css" />
<h:outputStylesheet library="global-mixins" name="css/fonts.css" />
<h:outputStylesheet library="global-mixins" name="css/forms.css" />
<h:outputStylesheet library="global-mixins" name="css/heights.css" />
<h:outputStylesheet library="global-mixins" name="css/margin.css" />
<h:outputStylesheet library="global-mixins" name="css/misc.css" />
<h:outputStylesheet library="global-mixins" name="css/padding.css" />
<h:outputStylesheet library="global-mixins" name="css/text.css" />
<h:outputStylesheet library="global-mixins" name="css/widths.css" />
<h:outputStylesheet library="easy-login" name="css/backgrounds.css" />
<h:outputStylesheet library="easy-login" name="css/content.css" />
<h:outputStylesheet library="easy-login" name="css/dialog.css" />
<h:outputStylesheet library="easy-login" name="css/error.css" />
<h:outputStylesheet library="easy-login" name="css/footer.css" />
<h:outputStylesheet library="easy-login" name="css/header.css" />
<h:outputStylesheet library="easy-login" name="css/icons.css" />
<h:outputStylesheet library="easy-login" name="css/input.css" />
<h:outputStylesheet library="easy-login" name="css/togglepanel.css" />
<h:outputStylesheet library="avalon-layout" name="css/layout-#{uiHelper.layoutColor}.css" />
<h:outputStylesheet library="avalon-layout" name="css/nanoscroller.css" />
<h:outputStylesheet library="avalon-layout" name="css/animate.css" />
<h:outputStylesheet library="avalon-layout" name="css/grid.css" />
<h:outputScript library="avalon-layout" name="js/nanoscroller.js" />
<h:outputScript library="avalon-layout" name="js/layout.js" />
</ui:composition>
Хотя эта страница несколько прямолинейна, всякий раз, когда меня перенаправляют на страницу unexpectedError.xhtml
, представление отображается без CSS:
Я, конечно, изучал пути решения этой проблемы.Похоже, этот пример ближе всего:
https://github.com/omnifaces/omnifaces/issues/495
У нас точно такая же проблема: возникает ошибка AJAX, переходим на страницу с ошибкой, страница с ошибкой отображается без CSS.
Ответ от BalusC:
Скорее всего, вместо этого у вас есть таблицы стилей, относящиеся к странице ошибки, в заголовке самой страницы ошибки или в общем шаблоне, который также используется страницей происхождения, гдеисключение брошено.Ответы Ajax по умолчанию не обновляют заголовок.
Не совсем.resources.css
в нашем случае является специфичным для шаблона (глобальным).
melloware перечисляет две другие ссылки:
h: outputStylesheet не вставляется при использовании FullAjaxExceptionHandler
h: тело не перерисовывается при использовании FullAjaxExceptionHandler
Эти парни, похоже, отказались от помещения всего CSS <h:outputStylesheet ...>
в <h:body>
ИЛИ, играя со стилями наbody
element.
Как видно из кода, наш h:body
не определяет классы CSS, а не стили вручную.thinTemplate.xhtml
используется исключительно на страницах входа и ошибок (тонкий, потому что ни один пользователь не вошел в систему и меню не отображается).
Что бы мы ни пытались, поместив CSS в h:body
плюс вседругие вещи, мы по-прежнему получаем неправильный рендеринг выше.
HTML-код в браузере:
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="j_idt2">
...
<link type="text/css" rel="stylesheet" href="/auth-portal/javax.faces.resource/css/application.css.xhtml?ln=global-mixins"/>
<link type="text/css" rel="stylesheet" href="/auth-portal/javax.faces.resource/css/borders.css.xhtml?ln=global-mixins"/>
<link type="text/css" rel="stylesheet" href="/auth-portal/javax.faces.resource/css/colors.css.xhtml?ln=global-mixins"/>
<link type="text/css" rel="stylesheet" href="/auth-portal/javax.faces.resource/css/fonts.css.xhtml?ln=global-mixins"/>
<link type="text/css" rel="stylesheet" href="/auth-portal/javax.faces.resource/css/forms.css.xhtml?ln=global-mixins"/>
<link type="text/css" rel="stylesheet" href="/auth-portal/javax.faces.resource/css/heights.css.xhtml?ln=global-mixins"/>
<link type="text/css" rel="stylesheet" href="/auth-portal/javax.faces.resource/css/margin.css.xhtml?ln=global-mixins"/>
<link type="text/css" rel="stylesheet" href="/auth-portal/javax.faces.resource/css/misc.css.xhtml?ln=global-mixins"/>
<link type="text/css" rel="stylesheet" href="/auth-portal/javax.faces.resource/css/padding.css.xhtml?ln=global-mixins"/>
<link type="text/css" rel="stylesheet" href="/auth-portal/javax.faces.resource/css/text.css.xhtml?ln=global-mixins"/>
<link type="text/css" rel="stylesheet" href="/auth-portal/javax.faces.resource/css/widths.css.xhtml?ln=global-mixins"/>
<link type="text/css" rel="stylesheet" href="/auth-portal/javax.faces.resource/css/backgrounds.css.xhtml?ln=easy-login"/>
<link type="text/css" rel="stylesheet" href="/auth-portal/javax.faces.resource/css/content.css.xhtml?ln=easy-login"/>
<link type="text/css" rel="stylesheet" href="/auth-portal/javax.faces.resource/css/dialog.css.xhtml?ln=easy-login"/>
<link type="text/css" rel="stylesheet" href="/auth-portal/javax.faces.resource/css/error.css.xhtml?ln=easy-login"/>
<link type="text/css" rel="stylesheet" href="/auth-portal/javax.faces.resource/css/footer.css.xhtml?ln=easy-login"/>
<link type="text/css" rel="stylesheet" href="/auth-portal/javax.faces.resource/css/header.css.xhtml?ln=easy-login"/>
<link type="text/css" rel="stylesheet" href="/auth-portal/javax.faces.resource/css/icons.css.xhtml?ln=easy-login"/>
<link type="text/css" rel="stylesheet" href="/auth-portal/javax.faces.resource/css/input.css.xhtml?ln=easy-login"/>
<link type="text/css" rel="stylesheet" href="/auth-portal/javax.faces.resource/css/togglepanel.css.xhtml?ln=easy-login"/>
...
</head>
<body>
<div id="thinHeader" class="">
<div id="thin-topbar" class="thinNavigation">
.
.
.
ВОПРОС :
Как вы /мы решаем это?Что именно было решением в билете OmniFaces?Я не понимаю.
Извините за долгую публикацию.Это, вероятно, необходимо.