2012-05-24 73 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