1

在生产中希望用户能够编写属性文件并将该文件上传到我们的生产服务器。一旦它到位,它将包含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 动态地皮肤我的richfaces 应用程序,该应用程序在我的 Tomcat 7 服务器启动时被初始化。理想情况下,皮肤文件的名称将是动态用户输入,可能从数据库或不同的属性文件中读取。

编辑 1:我已经让它加载属性文件,然后我手动(通过 java 代码)尝试通过使用servletContext.setInitParameter("org.richfaces.skin", this.skin);where this.skinis a 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文件?

谢谢

4

1 回答 1

1

实现这样的 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));
    }
}
于 2013-02-28T20:45:19.850 回答