我只使用 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);
我可以在控制台/终端中看到
Alpha
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) );
几乎相同,甚至与环境
输出是:
Beta
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 相同的限制,并且注意不要与 bean 实例交互。为了更细粒度地控制与 @Configuration beans 交互的条件,请考虑配置条件界面。
About 配置条件我读过这个何时使用 Spring @ConfigurationCondition 与 @Condition? too
我已编辑如下:
public class LocalHostStatusCondition implements ConfigurationCondition {
…
@Override
public ConfigurationPhase getConfigurationPhase() {
return ConfigurationPhase.PARSE_CONFIGURATION;
}
如果我使用:
-
配置阶段.REGISTER_BEAN我如何得到相同的输出Beta
-
ConfigurationPhase.PARSE_CONFIGURATION;我没有收到任何错误,但是...
但控制台/终端没有显示任何有关句子的信息,我的意思是,System.out 没有打印(我不明白这种奇怪的行为)。
我该如何解决这个问题?
我需要有工作@Value或环境,它的目的是让应用程序知道是否应该连接到本地或远程ActiveMQ服务器。
是的,我已阅读以下内容:如何延迟 Spring @Conditional 配置注释的评估?好像没有解决办法……
谢谢