spring boot @Value总是为null

时间:2017-07-04 14:16:31

标签: spring spring-mvc spring-boot

我正在使用spring boot 1.5.3并尝试将application-dev.properties文件中的属性注入Service bean,但该值始终为null。该值确实会在我的DevConfiguration类中加载。

我的基础包中有一个如下所示的应用程序类

package com.me;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;

@SpringBootApplication
public class Application {

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

}

我在

中有如下配置类
package com.me.print.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.PropertySources;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;

@Configuration
@Profile("dev")
@PropertySources({
    @PropertySource("classpath:application.properties"),
    @PropertySource("classpath:application-dev.properties")
})
@ComponentScan(value = {"com.me.print.client"})
public class DevConfiguration {

    @Value("${app.service.url}")
    private String rootUri;

    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

}

我正在尝试加载值的我的服务bean位于

之下
package com.me.print.client;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import com.me.print.model.zitResponse;

@Service
public class zitPrintClient {

    private final RestTemplate restTemplate;

    @Value("${app.service.url}")
    private String rootUri;

    public zitPrintClient(RestTemplateBuilder restTemplateBuilder) {
        restTemplate = restTemplateBuilder
                //.rootUri(rootUri)
                .build();
    }

    public zitResponse getpooltatus(String poolId) {
        return restTemplate.getForObject("/pool/{poolId}/@status",
                  zitResponse.class, poolId);
    }

}

在上面的类中,rootURI始终为null。有没有人对我缺少的东西有任何建议

在我的application-dev.properties文件中,我有以下

app.service.url=http://localhost:8080/zitprint/v1

由于

更新:

有没有人在这里有任何建议,因为我试图将属性注入我的控制器,如下所示:

@Value("${allowedVendors}") String allowedVendors

如果我将上面的内容放入构造函数中,它会找到值,但不会找到它:

public PController(@Value("${allowedVendors}") String allowedVendors) {

}

我无法在代码中进一步使用该属性,因为构造函数我已经通过构造函数创建了bean 1的两个实例,而另一个是由spring DI创建的。没有构造函数

的任何想法为什么值不会注入

由于

1 个答案:

答案 0 :(得分:2)

您需要将其作为参数放在构造函数中:

Query

在创建对象时,首先调用构造函数。成员变量rootUri会在创建对象后注入它的值。因此,在调用构造函数时,rootUri成员变量将为null。

(并且,为了更好的可读性,你的课程应该以大写字母开头,即ZitPrintClient,但它是你的代码...)