Как заставить работать @Value или Environment в классе, реализующем интерфейсы Condition / ConfigurationCondition
Я работаю только с JavaConfig.
У меня есть следующая декларация:
@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
это обязательно для JavaConfig в соответствии со следующим постом:Spring 3.2 аннотация @value с чистой конфигурацией Java не работает, но Environment.getProperty работает
Следующий код отлично работает (многие @Values в целях тестирования):
@Configuration
public class ActiveMQServerConfiguration {
@Value("${localhost.address}")
private String localHost;
@Value("${remotehost.address}")
private String remoteHost;
@Value("${localhost.port}")
private Integer localPort;
@Value("${remotehost.port}")
private Integer remotePort;
@Bean(name="connectionFactory")
@Conditional(LocalHostStatusCondition.class)
public ActiveMQConnectionFactory localConnectionFactory(
@Value("${localhost.protocol}") String protocol,
@Value("${localhost.address}") String host,
@Value("${localhost.port}") String port ){
System.out.println("protocol: "+protocol);
System.out.println("host: "+host);
System.out.println("port: "+port);
System.out.println("localHost: "+localHost);
System.out.println("localPort: "+localPort);
System.out.println("remoteHost: "+remoteHost);
System.out.println("remotePort: "+remotePort);
Я вижу в консоли / терминале
Альфа
protocol: tcp
host: 127.0.0.1
port: 61616
localHost: 127.0.0.1
localPort: 61616
remoteHost: 192.168.1.34
remotePort: 61616
Но следующее не работает, как ожидалось:
public class LocalHostStatusCondition implements Condition {
private static final Logger logger = LoggerFactory.getLogger(LocalHostStatusCondition.class);
@Value("${localhost.address}")
private String localHost;
@Value("${remotehost.address}")
private String remoteHost;
@Value("${localhost.port}")
private Integer localPort;
@Value("${remotehost.port}")
private Integer remotePort;
@Autowired
private Environment environment;
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
logger.info("LocalHostStatusCondition...");
System.out.println("localHost: "+localHost);
System.out.println("localPort: "+localPort);
System.out.println("remoteHost: "+remoteHost);
System.out.println("remotePort: "+remotePort);
System.out.println("Env..." + environment.getProperty("localhost.address", String.class) );
Практически то же самое и даже работая сСреда
Выход:
Бета
localHost: null
localPort: null
remoteHost: null
remotePort: null
[WARNING]
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:293)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
at com.manuel.jordan.infrastructure.support.LocalHostStatusCondition.matches(LocalHostStatusCondition.java:42)
Согласно сAPI условий:
Условия должны следовать тем же ограничениям, что и BeanFactoryPostProcessor, и заботиться о том, чтобы никогда не взаимодействовать с экземплярами компонента. Для более детального контроля условий, взаимодействующих с компонентами @Configuration, рассмотримConfigurationCondition интерфейс.
ОколоConfigurationCondition Я прочитал этоКогда использовать Spring @ConfigurationCondition или @Condition? тоже
Я отредактировал следующее:
public class LocalHostStatusCondition implements ConfigurationCondition {
…
@Override
public ConfigurationPhase getConfigurationPhase() {
return ConfigurationPhase.PARSE_CONFIGURATION;
}
Если я использую:
ConfigurationPhase.REGISTER_BEAN Я получаю такой же вывод, какБетаConfigurationPhase.PARSE_CONFIGURATION; Я не получаю ошибок, но ...но консоль / терминал не показывает ничего о работающих предложениях, я имею в виду, что System.out не печатает (я не понимаю этого странного поведения).
Как я могу решить это?
Мне нужно иметь работающее @Value или Environment, чтобы дать знать приложение, если оно должно подключаться к локальному или удаленному серверу ActiveMQ.
И да, я прочитал следующее:Как мне отложить оценку аннотации конфигурации Spring @Conditional? кажется, нет решения ...
Благодарю вас