4

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

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

4

2 回答 2

7

你不能做你想做的事。

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

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

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

于 2012-05-24T22:16:10.563 回答
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);
}

您将需要创建一个 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"));
}
于 2012-07-03T14:07:37.597 回答