从属性文件中获取常量?

时间:2012-05-24 22:03:05

标签: java properties constants

是否可以从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”),那就好了,但不是来自属性文件。

NB。为了清楚起见,上面的代码从属性文件中检索值没有问题。问题在于它不被视为常数。

2 个答案:

答案 0 :(得分:6)

你无法做你想做的事。

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

正如您所看到的,这对编译器来说有点多了。

您只能在运行时执行该代码,因为您尝试为注释分配值(因此,注释的值必须在编译时间)。

答案 1 :(得分:3)

如果您使用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);
}

您需要创建一个DymnamoDBMapper ...

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"));
}