可以有一个ApplicationScoped bean,它可以使用richfaces皮肤覆盖JSF 2应用程序吗?

在生产中希望用户能够编写属性文件并将该文件上载到我们的生产服务器。 一旦到位,它将包含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 */ } 

有任何想法吗? 基本上我想通过在我的Tomcat 7服务器启动时初始化的ApplicationScoped ManagedBean动态地为我的richfaces应用程序设置外观。 理想情况下,外观文件的名称是动态用户输入,可能是从数据库或不同的属性文件中读取的。

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

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

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

谢谢

要实现类似这样的东西,RichFaces源代码是你最好的朋友。

以下是我发现你如何做你想做的事情:

将文件添加到jar(或任何地方,以便它将出现在类路径中) 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)); } }