Лучшие практики для отображения страницы ошибок в 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);
}
}