sourcecode

SpEL @ConditionalOnProperty 문자열 속성이 비어 있거나 null입니다.

copyscript 2023. 7. 23. 14:37
반응형

SpEL @ConditionalOnProperty 문자열 속성이 비어 있거나 null입니다.

현재 applications.yaml 파일의 String 속성을 조건으로 데이터Source bean 생성에 문제가 있습니다.

url이 application.yaml 파일에 설정된 경우에만 dataSource bean을 생성하는 것이 좋습니다.빈이 없거나 null인 경우 빈을 만들지 않아야 합니다.이 조건이 boolean에서 확인되는 것으로 알고 있지만 문자열 속성이 비어 있는지 null인지 확인할 수 있는 방법이 있습니까?

DatabaseConfig.java

@Configuration
public class DatabaseConfig {
    @Value("${database.url:}")
    private String databaseUrl;

    @Value("${database.username:}")
    private String databaseUsername;

    @Value("${database.password:}")
    private String databasePassword;

    protected static final String DRIVER_CLASS_NAME = "com.sybase.jdbc4.jdbc.SybDriver";


    /**
     * Configures and returns a datasource. Optional
     *
     * @return A datasource.
     */
    @ConditionalOnProperty(value = "database.url")
    @Bean
    public DataSource dataSource() {
        return DataSourceBuilder.create()
            .url(testDatabaseUrl)
            .username(testDatabaseUsername)
            .password(testDatabasePassword)
            .build();
    }
}

application.yml(이 필드는 선택 사항임)

database:
  url: http://localhost:9000

사용할 수 있습니다.@ConditionalOnExpressionSpring Expression Language(SpEL) 식을 값으로 사용합니다.

@ConditionalOnExpression("!T(org.springframework.util.StringUtils).isEmpty('${database.url:}')")
@Bean
public DataSource dataSource() {
    // snip
}

가독성과 재사용성을 개선하기 위해 이를 주석으로 변환할 수 있습니다.

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@ConditionalOnExpression("!T(org.springframework.util.StringUtils).isEmpty('${database.url:}')")
public @interface ConditionalOnDatabaseUrl {
}

@ConditionalOnDatabaseUrl
@Bean
public DataSource dataSource() {
    // snip
}

저도 같은 문제를 겪고 있습니다.제가 이해하지 못했던 것처럼, 당신은 "속성이 존재하고 비어 있지 않은" 조건을 찾고 있습니다.이 조건은 박스에서 나오지 않기 때문에 약간의 코딩이 필요합니다.솔루션 사용org.springframework.context.annotation.Conditional내게 맞는 것:

  1. 만들다ConditionalOnPropertyNotEmpty주석 및 첨부 파일OnPropertyNotEmptyCondition클래스는 다음과 같습니다.

     // ConditionalOnPropertyNotEmpty.java
    
     import org.springframework.context.annotation.Condition;
     import org.springframework.context.annotation.ConditionContext;
     import org.springframework.context.annotation.Conditional;
     import org.springframework.core.type.AnnotatedTypeMetadata;
     import java.lang.annotation.ElementType;
     import java.lang.annotation.Retention;
     import java.lang.annotation.RetentionPolicy;
     import java.lang.annotation.Target;
     import java.util.Map;
    
     @Target({ ElementType.TYPE, ElementType.METHOD })
     @Retention(RetentionPolicy.RUNTIME)
     @Conditional(ConditionalOnPropertyNotEmpty.OnPropertyNotEmptyCondition.class)
     public @interface ConditionalOnPropertyNotEmpty {
         String value();
    
         class OnPropertyNotEmptyCondition implements Condition {
    
             @Override
             public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
                 Map<String, Object> attrs = metadata.getAnnotationAttributes(ConditionalOnPropertyNotEmpty.class.getName());
                 if (attrs == null) {
                     return false;
                 }
                 String propertyName = (String) attrs.get("value");
                 String val = context.getEnvironment().getProperty(propertyName);
                 return val != null && !val.trim().isEmpty();
             }
         }
     }
    
  2. 빈에 주석 달기ConditionalOnPropertyNotEmpty예:

     @ConditionalOnPropertyNotEmpty("database.url")
     @Bean
     public DataSource dataSource() { ... }
    

--

또는 detabase.url을 명시적으로 false로 설정할 수 있습니다(예:detabase.url: false) 또는 정의하지 않음detabase.url구성에 포함됩니다.그리고나서,@ConditionalOnProperty(value = "database.url")기대했던 대로 당신을 위해 일할 것입니다.

Spring Core의 표준인 보다 일반적인 목적 주석을 시도할 수 있습니다.org.springframework.context.annotation.Conditional.

콜백의 컨텍스트 개체에서 필요한 모든 정보를 얻을 수 있습니다.org.springframework.context.annotation.Condition

또한 프로파일 사용을 고려할 수 있습니다.

위의 주요 답변은 맞지만, 이후로.isEmpty는 더 이상 사용되지 않습니다. Apache Commons가 로드된 경우에는 (사용자가) 를 사용할 수 있습니다.isNotEmpty그리고 조건을 단순화합니다.

@ConditionalOnExpression(
    "T(org.apache.commons.lang3.StringUtils).isNotEmpty('${database.url:}')"
)

언급URL : https://stackoverflow.com/questions/46118782/spel-conditionalonproperty-string-property-empty-or-nulll

반응형