可能有一个ApplicationScoped豆是皮肤一个JSF 2应用程序与RichFaces的皮肤

2019-08-17 04:49发布

在生产中希望用户能够写一个属性文件和文件上传到我们的生产服务器。 一旦到位,将包含所需的RichFaces的皮肤属性。 此文件可以任意命名。

在发展中,我想要的属性文件,以从内部读取WEB-INF/myprop.properties在我的所有其他属性文件。 此文件可以任意命名。

到目前为止,我已经做到了这一点:

@ManagedBean(name="myCustomSkin ")
@ApplicationScoped
public class MyCustomSkin extends SkinFactoryImpl {
    /*
     * In here I call 
     * Skin s = this.buildSkin(context, "skin"); in my constructor
     * I am also overriding the loadProperties() method so it load my properties just fine
     * For some reason I can't get my app to actually use the properties I have loaded
     */
}

有任何想法吗? 基本上我想动态皮肤通过ApplicationScoped ManagedBean是大干快上我的Tomcat 7服务器的启动初始化我RichFaces的应用。 理想情况下,皮肤文件的名称将可能从数据库或不同的属性文件中读取动态用户输入。

编辑1:我已经得到它加载属性文件,然后我手动(通过Java代码)试图通过使用插入的context-param servletContext.setInitParameter("org.richfaces.skin", this.skin); 其中this.skin是一个字符串变量,我得到的值是这样的: this.skin = s.getName(); 如果你看到上面的s只是皮肤对象我从后面this.buildSkin 。 这涉及到一个SkinNotFound Exception ,因为我假设我的皮肤是不是在我的类路径或东西越来越到位。

编辑2:使用JSF 2.1.17,RichFaces的4.3.0和Tomcat7

编辑3:有没有办法告诉RichFaces的在不同的目录中查找myskin.skin.properties文件?

谢谢

Answer 1:

要实现这样的RichFaces的源代码是你最好的朋友。

以下是我发现你如何能做到你想要什么:

将文件添加到一个jar(或任何地方,所以它会出现在classpath中) META-INF/services/org.richfaces.application.Module文件的内容应该是com.example.CustomModule

自定义模块的实施可以是这样的:

public class CustomModule implements Module {
    public void configure(ServicesFactory factory) {
        factory.setInstance(SkinFactory.class, new CustomSkinFactoryImpl());
    }
}

然后实现SkinFactory根据您的需求,例如,(如果你想扩展您的CustomSkin默认行为):

public class CustomSkinFactoryImpl extends SkinFactoryImpl {
    public Skin getSkin(FacesContext context) {
        return new CompositeSkinImpl(new CustomSkin(), super.getSkin(context));
    }
}


文章来源: Possible to have an ApplicationScoped bean that skins a JSF 2 application with a richfaces skin?