2012-05-24 5 views
3

자바 프로퍼티 파일을 상수로 사용할 수 있습니까? 응용 프로그램 개발 구성 파일 또는 프로덕션 사용 여부를 지시하는 마스터 속성 파일에 플래그를 설정할 수 있도록 내 응용 프로그램을 개발하려고합니다.속성 파일에서 상수 가져 오기?

응용 프로그램의 대부분은 잘 작동하지만 필자는 엔티티 클래스에서 데이터베이스 테이블 매핑을 사용하여 약간의 벽돌 벽을 공격했습니다. 다음과 같이 실제 클래스 자체가 주석을 필요 그래서 나는 디나모 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. 단지 위의 코드가 속성 파일에서 값을 검색하는 데 문제가 없다는 것을 분명히하기 위해서입니다. 문제는 상수로 취급되지 않는다는 것입니다.

+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을 만들어야합니다

...

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

테이블 이름을 동적으로 설정하는 데 이상한 방식입니다. 난 당신의 제안이 유용하다고하지만, 난 그냥 TableNameOverride DynamoDBMapperConfig.TableNameOverride tableNameOverride = 새로운 DynamoDBMapperConfig.TableNameOverride ( \t \t \t \t conf.getTableName())에 TABLENAME을 포함하는'Sting'을 통과, 이런 식으로 해결했다; – 0x41ndrea