openxava / 文档 / 第十三章:从外部文件的 @DefaultValueCalculator

课程:1. 入门教学 | 2. 基本域模型(上) | 3. 基本域模型(下) | 4. 优化用户界面 | 5. 敏捷开发 | 6. 映射式超类继承 | 7. 实体继承 | 8. 视图继承(View) | 9. Java 属性 | 10. 计算属性 | 11. 用在集合的 @DefaultValueCalculator | 12. @Calculation 和集合总计 | 13. 从外部文件的 @DefaultValueCalculator | 14. 手动更改 schema | 15. 多用户时默认值的计算 | 16. 同步持久属性和计算属性 | 17. 从数据库中的逻辑 | 18. 使用 @EntityValidator 进行验证 | 19. 验证替代方案 | 21. 自定义 Bean Validation 注解 | 22. 在验证中调用 REST 服务 | 22. 在验证中调用 REST 服务 | 23. 注解中的属性 | 24. 改进标准行为 | 25. 行为与业务逻辑 | 26. 参照与集合 | A. Architecture & philosophy | B. Java Persistence API | C. Annotations | D. Automated testing

目录

第十三章:从外部文件的 @DefaultValueCalculator
从属性文件中的默认值
总结
我们使用@Calculation 设置了持久属性,并为我们的应用程序定义了总的属性。我们现在将看如何从外部文件设置默认值。

从属性文件中的默认值

为 vatPercentage 设置默认值对用户很方便。您可以使用一个返回固定值的计算器(如 @DefaultValueCalculator),但在这种情况下,更改默认值意味着更改代码。或者,您可以从数据库中读取默认值(从计算器中使用 JPA),但在这种情况下,更改默认值意味着更新数据库表。
另一种选择是将此配置值存储在一个属性文件中,该文件具有"键 = 值"的对。在这种情况下,更改 vatPercentage 的默认值跟编辑文件一样简单。
让我们实现属性文件的选项。在 invoicing/src/main/resources 文件夹中创建一个名为 invoicing.properties 的文件,其中包含以下内容:
defaultVatPercentage=6
尽管可以使用 Java 中的 java.util.Properties 类来读取此文件,但我们更想自定义类来读取这些属性。我们将这类命名为 InvoicingPreferences,并将它放在一个名为 com.yourcompany.invoicing.util 的新包中。以下是此类的代码:
package com.yourcompany.invoicing.util; // 在 'util' 包

import java.io.*;
import java.math.*;
import java.util.*;
 
import org.apache.commons.logging.*;
import org.openxava.util.*;
 
public class InvoicingPreferences {
 
    private final static String FILE_PROPERTIES="invoicing.properties";
    private static Log log = LogFactory.getLog(InvoicingPreferences.class);
    private static Properties properties; // 我们在此保存值
 
    private static Properties getProperties() {
        if (properties == null) { // 使用 lazy initialization
            PropertiesReader reader = // PropertiesReader 是 OpenXava 的一个实用类
                new PropertiesReader( InvoicingPreferences.class, FILE_PROPERTIES);
            try {
                properties = reader.get();
            }
            catch (IOException ex) {
                log.error( XavaResources.getString( // 读取 i18n 信息
                    "properties_file_error", FILE_PROPERTIES), ex);
                properties = new Properties();
            }
        }
        return properties;
    }
 
    public static BigDecimal getDefaultVatPercentage() { // 唯一的公共方法
        return new BigDecimal(getProperties().getProperty("defaultVatPercentage"));
    }
}
如您所见,InvoicingPreferences 是一个具有一个静态方法 getDefaultVatPercentage() 的类。与直接读取属性文件相比,使用此类的优势在于,如果您更改读取的方式,例如从数据库或 LDAP 目录中读取,仅需更改此类。
在 vatPercentage 属性,您可以从默认计算器中使用此类 。以下有计算器的代码:
package com.yourcompany.invoicing.calculators; // 在 'calculators' 包

import org.openxava.calculators.*; // 將使用 ICalculator
import com.yourcompany.invoicing.util.*; // 將使用  InvoicingPreferences
 
public class VatPercentageCalculator implements ICalculator {
 
    public Object calculate() throws Exception {
        return InvoicingPreferences.getDefaultVatPercentage();
    }
}
如您所见,它只是从 InvoicingPreferences 返回 defaultVatPercentage。现在,您可以在 CommercialDocument 中的 vatPercentage 属性定义中使用此计算器,如下:
@DefaultValueCalculator(VatPercentageCalculator.class)
BigDecimal vatPercentage;
使用此代码后,当用户点击创建新发票时,vatPercentage 字段将使用 6 或您在 invoicing.properties 中输入的任何其他值。

总结

在本章中,您学会了如何在外部文件建立默认值并使用它来来配置我们在应用程序业务逻辑中使用的属性,从而当我们在需要修改这些属性时抽象出修改代码 。

下载本课源代码

对这节课有什么问题吗? 前往轮譠 一切都顺利吗? 前往第十四章