首页 > 解决方案 > 如何通过托管 Bean 在类中设置属性?

问题描述

我想通过 faces-config 文件在我的 java 类中设置一个属性:

<managed-bean>
    <managed-bean-name>utilsBean</managed-bean-name>
    <managed-bean-class>org.acme.bank.app.UtilsBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
    <managed-property>
      <property-name>filePath</property-name>
      <value>#{javascript:@ReplaceSubstring(@LeftBack(database.getFilePath(),"\\"),"\\","/")+"/"}</value>
    </managed-property>
  </managed-bean>

在我的 UtilsBean 类中,我拥有以下属性:

public String filePath;

public String getFilePath() {
        return filePath;
    }

    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }

但是当我在构造函数中输出值时,我得到一个空值。

public UtilsBean() throws Exception {
        super();        
        Database database = ExtLibUtil.getCurrentDatabase();
        System.out.println("database.getFilePath() = " + database.getFilePath());//returns filepath of current nsf
        System.out.println("this filepath = " + this.filePath);//returns null


        try {
        ...
    }
}

在我看来,该属性不是通过 faces-config 设置的,还是我做错了?

标签: javaxpages

解决方案


在我在 XPages 中学习 Java 的过程中,我得出了延迟加载更好的结论。这也是与 SSJS 相比的一大优势,因为它在 Java 中要容易得多。所以像:

private String filePath; public void getFilePath() { if (null == filePath) { setFilePath(); } return filePath; } public void setFilePath() { filePath = getFilePathVariableInSomeWay(); }

这意味着您只在使用设置代码时调用一次设置代码,而不是在实例化对象时调用。

它还避免调用性能不高的 SSJS。这也意味着您可以调试设置代码。这也意味着您正在使用特定于语言的编辑器以及相关的编译验证来生成设置代码。XML 无法验证 SSJS。Java 编辑器可以确保您没有任何编译时错误。

我不确定使用 faces-config 计算托管 bean 属性的好处,老实说我从未使用过它们。但是我可以看到在 Java 类本身中使用方法的一些强大优势,无论是在构造函数还是在 getter 中。


推荐阅读