在生产中希望用户能够编写属性文件并将该文件上传到我们的生产服务器。一旦它到位,它将包含丰富面孔皮肤所需的属性。此文件可以命名为任何名称。
在开发中,我希望从内部读取属性文件,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 动态地为我的 richfaces 应用程序蒙皮,该应用程序在我的 Tomcat 7 服务器启动时被初始化。理想情况下,外观文件的名称是动态用户输入,可能从数据库或其他属性文件中读取。
编辑 1:我已经让它加载属性文件,然后我手动(通过 java 代码(尝试使用 servletContext.setInitParameter("org.richfaces.skin", this.skin);
插入上下文参数,其中 this.skin
是一个字符串变量,我得到的值如下:this.skin = s.getName();
,如果你在上面看到s
只是我从this.buildSkin
那里得到的皮肤对象。这很SkinNotFound Exception
,因为我假设我的皮肤没有在我的课堂路径或其他东西中占据一席之地。
编辑 2:使用 JSF 2.1.17、富脸 4.3.0 和 Tomcat7
编辑3:有没有办法告诉富人脸在不同的目录中查找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));
}
}