1

我们正在开发一个带有嵌入式 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));
            }
        };
    }

whereerrorPage是指向错误文件的静态变量。不幸的是,来自 Omnifaces 的FacesExceptionFilterFullAjaxExceptionHandler类不起作用(因为我们没有 web.xml)。那么这种方法真的是在连接面中实现错误页面映射的最佳方法,还是有更好的解决方案可用?

4

2 回答 2

1

我能够使用 joinfaces 和 spring-boot 2 为 primefaces 配置错误处理。为了让它工作,我扩展了 PrimeExceptionHandlerFactory 以覆盖根据抛出的异常决定错误页面在哪里的方法。此扩展错误处理程序在 src/main/resources/META-INF/faces-config.xml 上配置。这种方法还启用了“p:ajaxExceptionHandler”组件功能。

就我而言,任何 web.xml 配置都被忽略了,我认为这是因为我使用了提供 Spring Boot 的嵌入式 tomcat。如果您正在部署读取 .war/.ear 应用程序,您可以只在 web.xml 中定义错误页面

这是一个相当的技巧,如果 joinfaces 可以在检测到 primefaces 时进行配置,那就太好了,需要错误处理才能创建带有 primefaces 的 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;
        }

    }

}
于 2019-03-09T12:34:35.443 回答
0

我找到了这个错误处理解决方案,并使其也与 URL 资源相同

解决此问题的一种方法是扩展 WebMvcConfigurerAdapter。然而,从 Spring 5 开始,WebMvcConfigurerAdapter 已被弃用。一个解决方案是直接使用 WebMvcConfigurer 接口。

创建一个实现 WebMvcConfigurer 的 WelcomePageRedirect 类。

所以我为 index 和 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

于 2018-11-03T18:42:17.663 回答