【问题标题】:Obtain Constant from Properties file?从属性文件中获取常量?
【发布时间】:2012-05-24 22:03:05
【问题描述】:

是否可以从 java 属性文件中获取常量?我正在尝试开发我的应用程序,以便我可以在主属性文件中设置一个标志,指示应用程序是使用开发配置文件还是生产配置文件。

大多数应用程序工作正常,但我在实体类中的数据库表映射遇到了一些障碍。我使用的是 Dynamo DB,所以实际的类本身需要如下注释:

@DynamoDBTable(tableName = "table_name")
public class EmailTemplates {
...

tableName 值必须是一个常量,我正在尝试使用以下内容从属性文件中检索值并将其传递给 tableName;

@DynamoDBTable(tableName = DynamoTable.TABLE_NAME)
public class EmailTemplates {
...

DynamoTable 类:

public final class DynamoTable {

    public static final String TABLE_NAME = ResourceBundle.getBundle(ResourceBundle.getBundle("ProjectStage").getString("ProjectStage")).getString("EmailTemplates");

}

不幸的是,它不起作用,因为它说值不是常数。如果我简单地输入一个文字字符串(即“aStringValue”),那么它很好,但不是来自属性文件。

注意。需要明确的是,上述代码从属性文件中检索值没有问题。问题是它没有被视为常量。

【问题讨论】:

  • @Jeffrey 抱歉,我已将问题添加到帖子末尾。
  • 你说需要为生产和开发定义不同的属性文件。我不知道为什么你需要让表名变量,不是有一个单独的生产数据库和开发数据库,​​你不能玩连接字符串而不是改变表名吗?
  • 技术上是的。但 DynamoDB 是亚马逊的 NoSQL 数据库,与使用关系数据库略有不同。

标签: java properties constants


【解决方案1】:

你不能做你想做的事。

您要求 javac 编译器执行任意代码以从磁盘读取属性文件,提取一个值,并将其作为常量插入到您的代码中(在编译时)。

如您所见,编译器要做的事情有点多。

您只能在 runtime 执行该代码,这不适合您的情况,因为您正在尝试为注解分配值(因此注解的值必须在编译时间)。

【讨论】:

  • 我担心是这种情况,然后回到绘图板......感谢您的快速响应。
【解决方案2】:

如果您使用 DynamoDBMapper 类进行数据库交互,则可以选择为加载、保存、删除、查询和扫描提供额外的 DynamoDBMapperConfig 参数。

您可以在运行时构建此配置,然后将其传递给 dynamoDB 操作。

private DynamoDBMapperConfig getEnvironmentConfig(DymanoTable tableEntity, String environment)
{
    DynamoDBTable annotation = (DynamoDBTable) tableEntity.getClass().getAnnotation(DynamoDBTable.class);
    DynamoDBMapperConfig.TableNameOverride tableNameOverride = new DynamoDBMapperConfig.TableNameOverride(environment + annotation.tableName());
    return new DynamoDBMapperConfig(tableNameOverride);
}

您需要创建一个 DynamoDBMapper...

AWSCredentials credentials = new PropertiesCredentials(
                ObjectPersistenceQueryScanExample.class.getResourceAsStream("AwsCredentials.properties"));

        client = new AmazonDynamoDBClient(credentials);
        DynamoDBMapper mapper = new DynamoDBMapper(client);

并将其用于您的 dynamoDB 交互

public void save(DynamoTable entity)
{
    mapper.save(entity, getEnvironmentConfig(entity,"dev"));
}

【讨论】:

  • 你用来动态设置表名的方式很奇怪。我发现您的建议很有用,但我已经通过这种方式解决了,只需将包含表名的Sting 传递给 TableNameOverride DynamoDBMapperConfig.TableNameOverride tableNameOverride = new DynamoDBMapperConfig.TableNameOverride(conf.getTableName());
猜你喜欢
  • 1970-01-01
  • 2019-02-12
  • 2013-02-08
  • 1970-01-01
  • 2015-10-23
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多