我们正在开发一个带有嵌入式tomcat,spring-boot(无mvc)和joinfaces的Web应用程序。我们没有web.xml或web-fragment.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
是指向错误文件的静态变量。不幸的是,来自Omnifaces的类FacesExceptionFilter或FullAjaxExceptionHandler不起作用(因为我们没有web.xml)。那么这种方法真的是在joinfaces中实现错误页面映射的最佳方法,还是有更好的解决方案?
我能够使用joinfaces和spring-boot 2为primefaces配置错误处理.Ir命令它工作我扩展了PrimeExceptionHandlerFactory以覆盖根据抛出的异常决定错误页面位置的方法。此扩展错误处理程序在src / main / resources / META-INF / faces-config.xml上配置。此方法还启用了“p:ajaxExceptionHandler”组件功能。
在我的例子中,任何web.xml配置都被忽略了,我认为这是因为我使用了提供spring boot的嵌入式tomcat。如果要部署读取.war / .ear应用程序,则只需在web.xml中定义错误页面即可
这是一个非常黑客,如果在检测到primefaces时joinfaces可以配置这个很好,那么为了创建一个带有primefaces的JSF应用程序,需要进行错误处理。
完整的工作项目可以在:https://github.com/ollbap/my-primefaces-spring-boot-skeleton找到
看到:
faces-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>
extended prime exception handler factory.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资源相同
解决此问题的方法是扩展WebMvcConfigurerAdapter。然而,从Spring 5开始,WebMvcConfigurerAdapter已被弃用。解决方案是直接使用WebMvcConfigurer接口。
创建一个实现WebMvcConfigurer的WelcomePageRedirect类。
所以我为索引和hello以及错误做了root例子
希望完全对你有用
老路
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);
}
}
新方法
@Configuration
public class WelcomePageRedirect implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/")
.setViewName("forward:/helloworld.xhtml");
registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
}
}
有关https://codenotfound.com/jsf-primefaces-welcome-page-redirect-example.html的更多信息