如何在多个战争之间共享一个jsf错误页面

Posted

技术标签:

【中文标题】如何在多个战争之间共享一个jsf错误页面【英文标题】:how to share a jsf error page between multiple wars 【发布时间】:2011-07-19 19:06:22 【问题描述】:

我正在尝试在多个战争之间共享一个错误页面 (error.xhtml)。它们都在一个大耳朵应用程序中,并且都使用一个通用的 jar 库,我想把它放在这里。

错误页面应该使用 web.xml,或者更好的 web-fragment.xml,并且会被声明为标准的 java ee 错误页面。

实际EAR结构:

EAR
 EJB1
 EJB2
 WAR1 (using CommonWeb.jar)
 WAR2 (using CommonWeb.jar)
 WAR3 (using CommonWeb.jar)

仅仅将错误页面放在 META-INF/resources 下是行不通的,因为它不是资源。

我希望在每个 war 文件中配置尽可能少。

我正在使用 Glassfish 3.1,但希望尽可能使用 Java EE 6 标准。

【问题讨论】:

【参考方案1】:

您需要创建一个自定义ResourceResolver,它从类路径中解析资源,将其放入公共JAR 文件中,然后在JAR 的web-fragment.xml(或WAR 的web.xml)中声明它。

启动示例:

package com.example;

import java.net.URL;

import javax.faces.view.facelets.ResourceResolver;

public class FaceletsResourceResolver extends ResourceResolver 

    private ResourceResolver parent;
    private String basePath;

    public FaceletsResourceResolver(ResourceResolver parent) 
        this.parent = parent;
        this.basePath = "/META-INF/resources"; // TODO: Make configureable?
    

    @Override
    public URL resolveUrl(String path) 
        URL url = parent.resolveUrl(path); // Resolves from WAR.

        if (url == null) 
            url = getClass().getResource(basePath + path); // Resolves from JAR.
        

        return url;
    


web-fragment.xmlweb.xml

<context-param>
    <param-name>javax.faces.FACELETS_RESOURCE_RESOLVER</param-name>
    <param-value>com.example.FaceletsResourceResolver</param-value>
</context-param>

【讨论】:

我们可以把它放在通用库jar的web-fragment.xml中,这样我就不需要在每个jar中定义它了吗? 好的。它在 web.xml 中配置时起作用,而不是在 web-fragment.xml 中。 web-fragment.xml 在 META-INF/ 你的回答基本上是正确的。我的 web-fragment.xml 似乎没有任何效果,但这是另一个问题 ;-) 仅供参考,它已经在 web-fragment.xml 中工作了大约 6 个月。从那时起,我遇到了各种问题(版本 nr 等)。 如何从战争中使用这个error.xhtml?即

以上是关于如何在多个战争之间共享一个jsf错误页面的主要内容,如果未能解决你的问题,请参考以下文章

配置到jsf中的错误页面时出错?

JSF 2全局异常处理,导航到错误页面没有发生

jsf中的异常处理 - 在新页面中打印错误消息

JSF/Grails 应用的静态分析工具

如何在页面呈现期间测试是不是存在 JSF 导航案例

共享处理程序和支持 bean