联接面中错误页面映射的最佳实践

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了联接面中错误页面映射的最佳实践相关的知识,希望对你有一定的参考价值。

我们正在开发一个带有嵌入式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的类FacesExceptionFilterFullAjaxExceptionHandler不起作用(因为我们没有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的更多信息

以上是关于联接面中错误页面映射的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

更新片段参数的最佳实践?

在片段和活动之间进行通信 - 最佳实践

grails 索引页面的最佳实践

android片段-数据传递-最佳实践[重复]

在另一个活动托管的片段之间传递数据的最佳实践

改善用户体验的404页面最佳实践