programing

Spring Boot SpEL 조건부 OnExpression 확인 다중 속성

bestprogram 2023. 7. 26. 22:14

Spring Boot SpEL 조건부 OnExpression 확인 다중 속성

질문:.

Spring Expression Language를 사용하여 2개의 부울 속성이 참인지 확인하려면 어떻게 해야 합니까?

예를 들어 단일 속성이 참인지 확인하려면 다음 구문을 사용합니다.

@ConditionalOnExpression("${property.from.properties.file}")

확인을 위한 구문은 무엇입니까?property1 == true && property2 == false속성의 값이 서로 다를 수 있습니다.

비슷한 질문의 대답:@ConditionalOnProperty 또는 @ConditionalOnExpression을 사용하는 동안조건을 확인하는 방법은 두 문자열을 연결하여 다음과 같은 검사를 수행합니다.

연결 솔루션

@ConditionalOnExpression("'${com.property1}${com.property2}'=='value1value2'")

그 구문은 그 코드를 읽는 누군가에게 혼란스럽게 보이고 그것은 진부한 해결책처럼 보입니다.솔루션이 실패하는 경우도 있습니다.값을 연결하지 않고 두 개의 개별 속성을 확인할 수 있는 적절한 방법을 찾고 싶습니다.

참고: 또한 제가 본 바로는 쉽게 검색할 수 있는 답이 아닙니다.그것은 정말 간단한 답인 것처럼 보이지만 꽤나 이해하기 어려운 것으로 증명되고 있습니다.

주석@ConditionalOnProperty그리고.@ConditionalOnExpression둘 다 가지고 있지 않습니다.java.lang.annotation.Repeatable주석을 사용하면 여러 속성을 확인하기 위해 여러 주석을 추가할 수 없습니다.

다음 구문이 테스트되어 작동합니다.

두 가지 속성에 대한 솔루션

@ConditionalOnExpression("${properties.first.property.enable:true} && ${properties.second.property.startServer:false}")

다음 사항에 유의하십시오.

  • 표현식 언어 문에서 속성의 기본값을 나타내려면 콜론 표기법을 사용해야 합니다.
  • 각 속성이 별도의 식 언어 블록 ${}에 있습니다.
  • && 연산자는 SpEL 블록 외부에서 사용됩니다.

값이 서로 다른 여러 속성을 허용하고 여러 속성으로 확장할 수 있습니다.

두 개 이상의 값을 확인하고 가독성을 유지하려면 평가 중인 다른 조건 간에 연결 연산자를 사용할 수 있습니다.

둘 이상의 속성을 위한 솔루션

@ConditionalOnExpression("${properties.first.property.enable:true} " +
        "&& ${properties.second.property.enable:true} " +
        "&& ${properties.third.property.enable:true}")

단점은 사용할 때처럼 matchIfMissing 인수를 사용할 수 없다는 것입니다.@ConditionalOnProperty모든 프로필/환경에 대한 속성이 .properties 또는 YAML 파일에 있는지 확인하거나 기본값에 의존해야 합니다.

제가 기억하는 한, 당신은 다음과 같은 표현을 사용할 수 있습니다.

@ConditionalOnExpression("'${com.property1}'.equals('${com.property2}')")

더 읽어보기 위해 여기 링크가 있습니다.

도움이 되었다면 제 혼란도 해소될 수 있도록 코멘트 부탁드립니다.

부울 속성을 사용하면 약간 혼란스러울 수 있습니다.

@Bean
@ConditionalOnExpression("${config.integration.materializedCollectionDeleteEnabled:true}  and  ${config.integration.dbTransactionsEnabled:false}")
public DefaultMaterializedCollectionUpdater defaultMaterializedCollectionUpdater(IntegrationConfig integrationConfig, MongoTemplate mongoTemplate) {
    return new DefaultMaterializedCollectionUpdater(integrationConfig, mongoTemplate);
}

콩은 제가 다음과 같은 특성을 가지고 있을 때 만들어져야 하는 것처럼 보일 수 있습니다.

config:
  integration:
    dbTransactionsEnabled: false
    materializedCollectionDeleteEnabled: true

은 하만콩만지않지왜습면냐하다 때문에 만들어지지 .${property:value}는 기본값을 제공하지만 속성이 값을 제공했는지 확인하지 않습니다.속성에 값이 있는지 명시적으로 확인하려면 ==를 사용합니다. 유지할 수 .

@Bean
@ConditionalOnExpression("${config.integration.materializedCollectionDeleteEnabled:true} == true  and  ${config.integration.dbTransactionsEnabled:false} == false")
public DefaultMaterializedCollectionUpdater defaultMaterializedCollectionUpdater(IntegrationConfig integrationConfig, MongoTemplate mongoTemplate) {
    return new DefaultMaterializedCollectionUpdater(integrationConfig, mongoTemplate);
}

디버그 사용 방법org.springframework.expression.spel.standard.Tokenizer

언급URL : https://stackoverflow.com/questions/40477251/spring-boot-spel-conditionalonexpression-check-multiple-properties