我正在尝试在多个战争之间共享一个错误页面(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标准.
解决方法
您需要创建一个自定义的
ResourceResolver
,它可以从classpath解析资源,将其放在通用的JAR文件中,然后在JAR的web-fragment.xml(或WARs的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.xml或web.xml中
<context-param> <param-name>javax.faces.FACELETS_RESOURCE_RESOLVER</param-name> <param-value>com.example.FaceletsResourceResolver</param-value> </context-param>