带有SpEL的@Value无法从属性中获取值

时间:2017-10-18 02:02:38

标签: java spring spring-boot

我在Spring Boot Application示例中有以下代码

@Configuration
@PropertySource("classpath:second.properties")
public class PropertyConfig {

    @Value("#{guru.username}")
    String user;

    @Value("#{guru.password}")
    String password;

    @Value("#{guru.url}")
    String url;


    @Bean
    FakeDataSource getFakeDataSource() {
        FakeDataSource fk = new FakeDataSource();

        fk.setName(user);
        fk.setPassword(password);
        fk.setUrl(url);

        return fk;
    }

    @Bean
    PropertySourcesPlaceholderConfigurer getPropertySourcesPlaceholderConfigurer() {
        PropertySourcesPlaceholderConfigurer placeholderConfigurer= new PropertySourcesPlaceholderConfigurer();
        //placeholderConfigurer.setLocation(new ClassPathResource("second.properties"));

        return placeholderConfigurer;
    }
}

FakeDataSource是一个简单的pojo,名称为passowrd,url属性。

然后是我的主要应用程序

@SpringBootApplication
public class SpringGuru101DependencyInjectionApplication {
    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(SpringGuru101DependencyInjectionApplication.class, args);

        // Step 2: Make Class
        FakeDataSource fakeDataSource = ctx.getBean(FakeDataSource.class);

        System.out.println(fakeDataSource.getName());
    }
}

但是sout语句打印为null, 我的second.properties文件存在于我的资源目录中,其中包含以下内容

guru.username=Saurabh
guru.password=ido
guru.url=http://example.com

2 个答案:

答案 0 :(得分:1)

有两个地方应该纠正:
(1)正如我在您的问题的评论中所说,您应该将井口标志(#)替换为美元符号($),以便从配置文件中读取值。例如:@Value("${guru.username}")

(2)您在方法public static前面错过了getPropertySourcesPlaceholderConfigurer 这个修改过的方法应该如下所示:

@Bean
public static PropertySourcesPlaceholderConfigurer getPropertySourcesPlaceholderConfigurer() {
    PropertySourcesPlaceholderConfigurer placeholderConfigurer= new PropertySourcesPlaceholderConfigurer();
    //placeholderConfigurer.setLocation(new ClassPathResource("second.properties"));

    return placeholderConfigurer;
}

答案 1 :(得分:0)

如果您使用的是Spring-boot,则可以使用其他方法来读取Spring引导建议的配置。这将帮助您摆脱所有@Value符号,允许弹簧注入属性而无需额外的提示。

您可以执行以下操作:

{{1}}

}

上面的POJO定义了以下属性:

foo.enabled,默认为false foo.remote-address,具有可以从String强制转换的类型 foo.security.username,带有嵌套的“安全性”,其名称由属性名称决定。特别是返回类型根本没有使用,可能是SecurityProperties foo.security.password foo.security.roles,带有String

的集合

更多详情:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html