Лучшие практики для отображения страницы ошибок в joinfaces

Мы разрабатываем веб-приложение со встроенным tomcat, spring-boot (без mvc) и joinfaces. У нас нет ни web.xml, ни web-фрагмент.xml, поэтому отображение страницы с ошибкой немного сложнее. Мы реализовали отображение ошибок как @Bean аннотированный метод в @Configuration учебный класс. Например:

@Bean
    public ErrorPageRegistrar errorPageRegistrar() {
        return new ErrorPageRegistrar() {
            @Override
            public void registerErrorPages(ErrorPageRegistry registry) {
                registry.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, errorPage));
                registry.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, errorPage));
            }
        };
    }

куда errorPage статическая переменная, которая указывает на файл ошибок Такие классы, как FacesExceptionFilter или FullAjaxExceptionHandler из Omnifaces, к сожалению, не работают (так как у нас нет web.xml). Так действительно ли этот подход - лучший способ реализовать отображение страниц ошибок в joinfaces или есть лучшее решение?

1 ответ

Мне удалось настроить обработку ошибок для простых лиц с использованием joinfaces и spring-boot 2. И чтобы он работал, я расширил PrimeExceptionHandlerFactory, чтобы переопределить метод, который решает, где находится страница ошибки в соответствии с выданным исключением. Этот расширенный обработчик ошибок настроен в src/main/resources/META-INF/face-config.xml. Этот подход также включил функциональные возможности компонента "p:ajaxExceptionHandler".

В моем случае любая конфигурация web.xml была проигнорирована, я думаю, это потому, что я использую встроенный tomcat, который обеспечивает весеннюю загрузку. Если вы развертываете приложение для чтения.war /.ear, вы можете просто определить страницу ошибки в файле web.xml.

Это довольно хак, было бы здорово, если бы joinfaces мог настроить это при обнаружении простых лиц, обработка ошибок необходима для создания JSF-приложения с простыми лицами.

Полный рабочий проект можно найти по адресу: https://github.com/ollbap/my-primefaces-spring-boot-skeleton

Увидеть:

Лица-config.xml

<?xml version="1.0" encoding="windows-1252"?>
<!DOCTYPE faces-config PUBLIC
  "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 2.2//EN"
  "http://java.sun.com/dtd/web-facesconfig_2_2.dtd">
<faces-config xmlns="http://java.sun.com/JSF/Configuration">
    <name>MyApplication</name>

    <ordering>
        <before>
            <others />
        </before>
    </ordering>

    <application>
        <el-resolver>org.primefaces.application.exceptionhandler.PrimeExceptionHandlerELResolver</el-resolver>
    </application>
    <factory>
        <exception-handler-factory>es.test.config.ExtendedPrimeExceptionHandlerFactory</exception-handler-factory>
    </factory>
</faces-config>

ExtendedPrimeExceptionHandlerFactory.java

package es.test.config;

import java.util.Map;

import javax.faces.context.ExceptionHandler;
import javax.faces.context.ExceptionHandlerFactory;

import org.eclipse.jdt.annotation.Nullable;
import org.primefaces.application.exceptionhandler.PrimeExceptionHandler;
import org.primefaces.application.exceptionhandler.PrimeExceptionHandlerFactory;

/**
 * Extended primefaces exception handler factory in order to create a exception
 * handler that redirects to the desired error page.
 */
public class ExtendedPrimeExceptionHandlerFactory extends PrimeExceptionHandlerFactory {
    private static final String ERROR_PAGE = "error.xhtml";

    public ExtendedPrimeExceptionHandlerFactory(final ExceptionHandlerFactory wrapped) {
        super(wrapped);
    }

    @Override
    public ExceptionHandler getExceptionHandler() {
        return new ExtendedPrimeExceptionHandler(getWrapped().getExceptionHandler());
    }

    private static class ExtendedPrimeExceptionHandler extends PrimeExceptionHandler {

        public ExtendedPrimeExceptionHandler(ExceptionHandler wrapped) {
            super(wrapped);
        }

        @Override
        protected String evaluateErrorPage(@SuppressWarnings("null") Map<String, String> errorPages,
                @Nullable Throwable rootCause) {
            return ERROR_PAGE;
        }

    }

}

Я нашел это решение для обработки ошибок и сделал так же, как URL-ресурсы переопределить метод "addViewControllers" из WebMvcConfigurerAdapter.class

поэтому я сделал, например, корень для индекса и привет и ошибки

Надеюсь полностью вам пригодится

    import javax.faces.application.ResourceHandler;
    import javax.inject.Inject;

    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.Ordered;
    import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

    @Configuration
    public class DefaultView extends WebMvcConfigurerAdapter {

        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/").setViewName("forward:/index.xhtml");
            registry.addViewController("/hello") .setViewName("forward:/pages/hello.xhtml");

            registry.addViewController("

/error") .setViewName("forward:/jsf-templates/error_not_found.xhtml");

        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);

        super.addViewControllers(registry);
    }


}
Другие вопросы по тегам