Невозможно прочитать приложение.yml в классе условий

#spring #spring-boot

#spring #spring-загрузка

Вопрос:

У меня есть этот класс

 @Service
@Conditional(MyCondition.class)
public class Class1 implements AcknowledgingMessageListener<String, GenericRecord> {

  @Value("#{'${audit.module}'}")
  private String xyz;
  

Вот MyCondition

 @Configuration
@Component
@EnableConfigurationProperties
@ConfigurationProperties("audit")
public class MyCondition implements Condition {

  @Value("#{'${audit.module}'}")
  private String ss;

}
  

Проблема в MyCondition @Value том, что не удается прочитать значение из application.yml.

Комментарии:

1. Конечно, это так, поскольку это не компонент (и не должно быть), и к нему обращаются очень рано в процессе (до того, как произойдет какое-либо связывание). Так что это не сработает, возможно, вы сможете использовать Environment для получения значения.

2. не могли бы вы, пожалуйста, поделиться каким-нибудь примером того, что вы говорите?

Ответ №1:

MyCondition не является управляемым компонентом spring, когда вы используете его как @Conditional . Таким образом, вы не можете использовать @Value inside MyCondition . Однако есть некоторые обходные пути.

Вы можете установить как и добавить одно значение параметра с помощью . String ss static @Value

 @Component
public class MyCondition implements Condition {

    private static String ss;

    @Value("${audit.module}")
    public void setSs(String ss) {
        MyCondition.ss = ss;
    }

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return true;
    }
}

  

Но это значение будет установлено после Class1 создания, поэтому во время проверки @Conditional ss будет равно null.

Но я думаю, вам нужно будет использовать значение ss внутри matches метода. Таким образом, внутри matches метода вы можете получить доступ к значениям свойств с помощью ConditionContext

 public class MyCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        System.out.println(context.getEnvironment().getProperty("audit.module"));
        return true;
    }
}