Как поделиться страницей ошибок jsf между несколькими войнами

Я пытаюсь разделить страницу ошибки (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/не будет работать, поскольку это не ресурс.

Я хотел бы иметь как можно меньше настроек в каждом файле войны.

Я использую Glassfish 3.1, но хочу как можно больше использовать стандарты Java EE 6.

Ответ 1

Вам нужно создать пользовательский ResourceResolver, который разрешает ресурсы из classpath, помещает его в общий JAR файл и затем объявляет его в web-fragment.xml JAR (или в web.xml WAR).

Пример Kickoff:

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.xml или web.xml

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