我们正在开发一个具有嵌入式tomcat、spring-boot(无mvc)和joinfaces的web应用程序。我们既没有web.xml也没有web-fragment.xml,所以错误页面映射有点困难。我们在@Configuration
类中将错误映射实现为@Bean
注释方法。例如:
@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为素数面配置错误处理。为了让它工作,我扩展了PrimeExceptionHandlerFactory,以覆盖根据抛出的异常决定错误页面所在位置的方法。这个扩展的错误处理程序是在src/main/resources/META-INF/faces-config.xml上配置的。这种方法还启用了"p:ajaxExceptionHandler"组件功能。
在我的例子中,任何web.xml配置都被忽略了,我想这是因为我使用了提供spring-boot的嵌入式tomcat。如果您正在部署read.war/.ear应用程序,您可以在web.xml 中定义错误页面
这是一个很好的破解,如果joinfaces可以在检测到Primeffaces时配置它,那就太好了,需要进行错误处理才能创建具有Primeffaces的JSF应用程序。
完整的工作项目可在以下位置找到:https://github.com/ollbap/my-primefaces-spring-boot-skeleton
参见:
-
https://github.com/ollbap/my-primefaces-spring-boot-skeleton/blob/master/src/main/resources/META-INF/faces-config.xml
-
https://github.com/ollbap/my-primefaces-spring-boot-skeleton/blob/master/src/main/java/es/test/config/ExtendedPrimeExceptionHandlerFactory.java
面向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资源相同
解决此问题的方法是扩展WebMvcConfigurerAdapter。然而,从Spring 5开始,WebMvcConfigurerAdapter就被弃用了。解决方案是直接使用WebMvcConfigurer接口。
创建一个实现WebMvcConfigurer的WelcomePageRedirect类。
因此,我为索引和hello和error 创建了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