Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从属性文件中获取常数?_Java_Properties_Constants - Fatal编程技术网

Java 从属性文件中获取常数?

Java 从属性文件中获取常数?,java,properties,constants,Java,Properties,Constants,可以从java属性文件中获取常量吗?我正在尝试开发我的应用程序,以便在主属性文件中设置一个标志,指示应用程序使用的是开发配置文件还是生产配置文件 大多数应用程序工作正常,但我在实体类中的数据库表映射方面遇到了一些困难。我使用的是Dynamo DB,因此实际的类本身需要如下注释: @DynamoDBTable(tableName = "table_name") public class EmailTemplates { ... tableName值必须是一个常量,我试图使用以下命令从属性文件中检

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

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

@DynamoDBTable(tableName = "table_name")
public class EmailTemplates {
...
tableName值必须是一个常量,我试图使用以下命令从属性文件中检索该值并将其传递给tableName

@DynamoDBTable(tableName = DynamoTable.TABLE_NAME)
public class EmailTemplates {
...
可发电等级:

public final class DynamoTable {

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

}
不幸的是,它不起作用,因为它说值不是常数。如果我只放一个文字字符串(即“aStringValue”),那么它就很好,但不是从属性文件中


注意。需要明确的是,上面的代码从属性文件检索值时没有问题。问题是它没有被当作一个常数。

你不能做你想做的事

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

正如您所看到的,编译器要做的有点多


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

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

@Jeffrey抱歉,我在文章的结尾添加了这个问题。你说你需要为生产和开发定义不同的属性文件。我不知道为什么你需要把表名变为变量,难道没有一个单独的生产数据库和开发数据库吗?你不能用连接字符串来代替改变表名吗?技术上是的。但是DynamoDB是amazons NoSQL数据库,它与使用关系数据库略有不同。我担心是这样的,回到绘图板上。。。感谢您的快速响应。您过去动态设置表名的方式非常奇怪。我发现你的建议很有用,但我已经以这种方式解决了问题,只需将包含tablename的
Sting
传递给TableNameOverride DynamoDBMapperConfig.TableNameOverride TableNameOverride=new DynamoDBMapperConfig.TableNameOverride(conf.getTableName());