Spring Boot @Value属性

时间:2016-08-19 20:38:44

标签: spring spring-boot spring-annotations

我有一个Spring Boot应用程序,在其中一个类中,我尝试使用@Value从application.properties文件中引用属性。但是,该财产没有得到解决。我查看了类似的帖子并尝试遵循这些建议,但这并没有帮助。课程是:

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class PrintProperty {

  @Value("${file.directory}")
  private String fileDirectory;

  public void print() {
    System.out.println(fileDirectory);
  }
}

我在application.properties中有属性file.directory。我也有其他领域。

8 个答案:

答案 0 :(得分:17)

我遇到了和你一样的问题。这是我的错误代码。

@Component
public class GetExprsAndEnvId {
    @Value("hello")
    private String Mysecret;


    public GetExprsAndEnvId() {
        System.out.println("construct");
    }


    public void print(){
        System.out.println(this.Mysecret);
    }


    public String getMysecret() {
        return Mysecret;
    }

    public void setMysecret(String mysecret) {
        Mysecret = mysecret;
    }
}

这不是问题,但是 我们需要像这样使用它:

@Autowired
private GetExprsAndEnvId getExprsAndEnvId;

不喜欢这样:

getExprsAndEnvId = new GetExprsAndEnvId();

答案 1 :(得分:12)

确保您的application.properties文件位于src / main / resources / application.properties下。是一种方法。然后按如下方式添加@PostConstruct

示例Application.properties

file.directory = somePlaceOverHere

示例Java类

@ComponentScan
public class PrintProperty {

  @Value("${file.directory}")
  private String fileDirectory;

  @PostConstruct
  public void print() {
    System.out.println(fileDirectory);
  }
}

上面的代码将打印出#34; somePlaceOverhere"

答案 2 :(得分:6)

我想提一下,我使用了春季启动版本1.4.0,因为这个版本你只能写:

@Component
public class MongoConnection {

@Value("${spring.data.mongodb.host}")
private String mongoHost;

@Value("${spring.data.mongodb.port}")
private int mongoPort;

@Value("${spring.data.mongodb.database}")
private String mongoDB;
}

然后随时注入课程。

答案 3 :(得分:2)

要从application.properties中读取值,我们需要使用@SpringBootApplication注释我们的主类,以及使用@Component或其中各种类型读取的类。下面是我从application.properties读取值的示例,它在调用Web服务时工作正常。如果您按原样部署相同的代码并尝试从http://localhost:8080/hello进行访问,您将获得存储在application.properties中的关键消息的值。

package com.example;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class DemoApplication {

    @Value("${message}")
    private String message;

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

    @RequestMapping("/hello")
    String home() {
        return message;
    }

}

试着让我知道

答案 4 :(得分:1)

我遇到了类似的问题,上面的示例对我读取属性没有帮助。我在下面的链接中发布了完整的类,它将帮助您从SpringBoot应用程序中的application.properties文件读取属性值。

Spring Boot - Environment @Autowired throws NullPointerException

答案 5 :(得分:0)

您尚未在OP中包含包声明,但@SpringBootApplication@ComponentScan都无法扫描您的@Component

@ComponentScan Javadoc声明:

  

basePackageClassesbasePackages(或其别名value)可能是   指定用于定义要扫描的特定包。如果具体包装   未定义,扫描将从类的包中发生   声明这个注释。

ISTR之前浪费了大量时间,发现将应用程序类移动到应用程序包树中的最高包是最简单的。

最近我遇到了一个问题,即在插入值之前正在读取属性。 Jesse的答案很有帮助,因为@PostConstruct似乎是最早可以阅读插入值的,当然你应该让Spring称之为。

答案 6 :(得分:0)

您的问题是您的配置中需要 static PropertySourcesPlaceholderConfigurer Bean定义。我强调静态,因为我有一个非静态的,它没有用。

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

答案 7 :(得分:0)

在服务类中,我有同样的问题要为我的财产获取价值。我通过使用@ConfigurationProperties而不是@Value来解决它。

  1. 创建这样的类:
    import org.springframework.boot.context.properties.ConfigurationProperties;

    @ConfigurationProperties(prefix = "file")
    public class FileProperties {
        private String directory;

        public String getDirectory() {
            return directory;
        }

        public void setDirectory(String dir) {
            this.directory = dir;
        }
    }

  1. 将以下内容添加到您的BootApplication类中:
    @EnableConfigurationProperties({
        FileProperties.class
    })
  1. 将FileProperty注入到PrintProperty类中,然后可以通过getter方法获得该属性的所有权。