Spring和@Value注释

时间:2017-01-14 18:16:49

标签: java spring

我正在尝试使用Spring框架构建一个控制台应用程序。

我有一个由@SpringBootApplication注释的课程:

@SpringBootApplication
public class LoaderApplication {

    public static void main(String[] args) {
        SpringApplication.run(LoaderApplication.class, args);
    }
}

@Component

注释的类
@Component
public class ElasticLoader implements CommandLineRunner {

    // Elastic properties
    @Value("${elasticTransportAddress:#{null}}")
    private String elasticTransportAddress;

    private static final Logger log = LoggerFactory.getLogger(ElasticLoader.class);

    @Override
    public void run(String... arg) throws Exception {
        if (!( elasticTransportAddress != null && elasticTransportAddress.isEmpty() )) {
            log.error("[elasticTransportAddress] is not defined in property file");
            return;
        }
        log.info("-> ElasticLoader.run");
    }
}

正如您所看到的,在此类中,我正在尝试通过elasticTransportAddress注释注入属性@Value值,但在运行我的应用程序后,我可以看到属性elasticTransportAddress保持未分配状态。 / p>

我错过了什么?

让我补充一些注意事项:

我想将我的应用程序用于不同的属性文件。对于这种情况,我创建了xml-context-config.xml这样的内容:

    <beans profile="companies">
    <!-- allows for ${} replacement in the spring xml configuration from the
        application-default.properties, application-dev files on the classpath -->
    <context:property-placeholder
            location="classpath:companies.properties"
            ignore-unresolvable="true" />

    <!-- scans for annotated classes in the com.env.dev package -->
    <context:component-scan base-package="ru.alexeyzhulin" />
</beans>

并使用我放在

中的配置文件companies.properties

enter image description here

我使用描述的配置文件运行配置:

enter image description here

正如我在应用程序日志中看到的那样启用此配置文件:

2017-01-15 00:10:39.697  INFO 10120 --- [           main] ru.alexeyzhulin.LoaderApplication        : The following profiles are active: companies

但是,当我在application.properties中定义属性并使用默认配置文件时,属性elasticTransportAddress将被分配。

3 个答案:

答案 0 :(得分:3)

if条件中有错误。 这个:

if (!( elasticTransportAddress != null && elasticTransportAddress.isEmpty() ))

相当于:

if (elasticTransportAddress == null || !elasticTransportAddress.isEmpty())

因此,在两种情况下,您会收到错误日志消息+ return:

  1. 如果未定义属性或
  2. 如果属性已定义且其值为非空。
  3. 修复是重写if条件,例如

    if (elasticTransportAddress == null || elasticTransportAddress.isEmpty())
    

    更新1:您当然需要确保此值在应用程序属性中真正定义。

    更新2:您的xml-context-config.xml文件根本不被Spring使用。 建议的方法是使用@SpringBootApplication的基于注释的配置。您可以通过完全删除xml-context-config.xml 创建使用@Configuration 注释的类来完成此操作。此配置类可以包含定义属性源的注释。例如:

    @Configuration
    @Profile("companies")
    @PropertySource("classpath:companies.properties")
    public final class LoaderApplication {
    }
    

    请注意,如果您使用@ComponentScan,则需要明确启用@SpringBootApplication

答案 1 :(得分:2)

将companies.properties重命名为application-companies.properties。 Link到文档

答案 2 :(得分:1)

正如其他@Alex所说,你必须告诉Spring你想要检索这些属性的位置。你在这里缺少的是另一种配置,在你的情况下(基于注释的配置)你必须添加这个类:

@Configuration
public class MyConfiguration {

    @Bean
    public PropertyPlaceholderConfigurer getCompanyConfigurer() throws IOException {

        PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer();
        configurer.setLocations(new ClassPathResource("classpath:companies.properties"));
        configurer.setIgnoreUnresolvablePlaceholders(true);

        return configurer;
    }

}

更新

如果您使用的是基于XML的配置,则必须告诉Spring Boot在LoaderApplication中删除注释@SpringBootApplication的XML配置是什么,并以这种方式将XML添加到SpringApplication:

SpringApplication.run("classpath:application-configuration.x‌​ml", args);

最后将此行添加到xml:

<context:property-placeholder ignore-unresolvable="true" location="classpath:companies.properties"/>

而且,就是这样,希望它有所帮助。