2012-05-24 75 views
3

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

大多数应用程序都可以正常工作,但我在实体类中使用数据库表映射命中了一块砖墙。我使用迪纳摩DB所以实际的类本身需要一个注解如下:

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

表名值必须是一个常数,我试图使用以下方法来检索值从属性文件并把它传递到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”),那么它很好,但不是来自属性文件。

注意:只需要清楚,上述代码从属性文件中检索值是没有问题的。问题在于它不被视为一个常量。

+0

定义: “不工作” – Jeffrey

+0

@Jeffrey对不起,我已经将问题添加到帖子末尾。 – tarka

+0

你说你需要为生产和开发定义不同的属性文件。我不知道为什么你需要使表名变量,没有一个单独的生产数据库和开发数据库,​​你不能改变连接字符串而不是改变表名? –

回答

6

你不能做你想做的事情。

你问javac编译执行任意代码读取性能,从磁盘文件,提取价值,并插入一个常数到你的代码(在编译时)。

正如你所看到的那样,编译器做的有点多。

,因为你想在编译时值分配给注释(从而为注释值必须为可用,则只能在运行,它不适合您的情况执行该代码)。

+0

我很担心是这样,回到绘图板然后......感谢您的快速反应。 – tarka

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 ...

​​

而且使用此为您dynamoDB互动

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

你用来动态设置表名的方式很奇怪。我发现你的建议是有用的,但我已经用这种方式解决,只是传递一个包含的表名到TableNameOverride DynamoDBMapperConfig.TableNameOverride tableNameOverride =新DynamoDBMapperConfig.TableNameOverride( \t \t \t \t conf.getTableName())的'Sting'; – 0x41ndrea