2017-03-10 4 views
0

나는 동적 속성 이름을 검색하여 값을 설정해야하는 인스턴스 변수가 있습니다.Spring SPEL을 사용하여 동적 속성 이름을 확인하는 방법은 무엇입니까?

Class Test { 
    @Value("#{T(java.lang.String).format('filter.%s.disable', getClass().getSimpleName())}") 
    private boolean disable; 
} 

disable 그렇지 않으면 truefilter.Test.disable = truefalse으로 평가해야합니다. 속성이 정의되지 않은 경우 기본값 인 false을 설정하려고합니다. 일반적으로 다음 구문을 사용하여 수행되지만이 경우에는 확실하지 않습니다. @Value("${property:default}")

내가 오류를 받고 있어요 :

Caused by: java.lang.IllegalArgumentException: Invalid boolean value [filter.BeanExpressionContext.disable]

또한 @Value("${'dcs.cloud.filter.'#{getClass().getSimpleName()}'.disable'}")을 시도하고 아무 소용이 #$의 다른 조합.

SPEL doc은 다른 구문을 사용하는 표현식을 평가하는 데 쓸모없는 parser.parseExpression 호출을 보여 주지만 실제로는 아무도 수행하지 않습니다. 실제 예제 대신 단위 테스트에서 코드를 선택하는 것 같습니다.

답변

0

식이 그렇게 선언 된 클래스에는 액세스 할 수 없습니다. getClass() 표현식 평가를위한 루트 객체 (이 경우 BeanExpressionContext)에 대한 작업이 수행됩니다.

여기에 filter.Test.disable을 사용할 수없는 이유는 분명하지 않습니다 (Test이 서브 클래스로 분류 될 때 실제 클래스를 얻으 려하지 않는 한).

당신은 그렇게 할 수 없습니다.

EnvironmentAware을 구현하고 환경에서 속성을 가져와 부울을 설정하는 것이 더 쉬울 수도 있습니다.

+0

나는 그것을했고, 환경을 주입하고 가치를 찾았다. a) 리팩토링은 그것을 깨뜨릴 것이기 때문에 b)는 서브 클래스에서 작동하지 않기 때문에 클래스 이름을 하드 코딩하고 싶지 않습니다. –