#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;
}
}