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

2022-09-04 19:27:49

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

错误页面应使用 web.xml 或更好的 web 片段.xml,并将声明为标准的 java ee 错误页面。

实际耳罩结构:

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

您需要创建一个自定义的资源解析器,用于解析类路径中的资源,将其放在通用 JAR 文件中,然后在 JAR(或 WAR)中声明它。web-fragment.xmlweb.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;
    }

}

与 in 或web-fragment.xmlweb.xml

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

答案 2

推荐