为什么我的spring引导Web应用程序无法加载其配置属性?

时间:2018-04-16 10:05:44

标签: java spring-boot web-applications

我创建了一个简单的示例spring boot Web应用程序,它运行良好。也就是说,Web应用程序启动,控制器通过调用服务并返回结果来响应请求。这让我有信心拥有基本权利。我现在正试图通过application.properties文件添加外部配置,我根本无法加载它。

我正在使用Spring Boot 2,Spring 5,Eclipse和Maven。我的pom.xml包含:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <version>2.0.1.RELEASE</version>
</dependency>

我的网络应用程序类是:

@SpringBootApplication(scanBasePackages="com.example.root")
public class ExampleWebApp {
    public static void main(String[] args) {
        SpringApplication.run(ExampleWebApp.class, args);
    }
}

我尝试加载环境的服务类是:

@Service
public class DataService {
    @Value("${com.example.property}")
    private String p1;
    @Value("com.example.property")
    private String p2;
    @Autowired
    private Environment env;
    public DataService() {
        ...
    }
 }

我的application.properties文件包含:

com.example.property=value

构建Web应用程序时,application.properties已正确复制到WEB-INF/classes

当应用程序运行并且我在服务的构造函数中放置了一个断点时,p1p2envnull。关于如何调试这个的任何建议?

2 个答案:

答案 0 :(得分:2)

通过构造函数进行调试将无法正常工作。因为值是通过反射注入的,这是在构造函数被调用之后发生的。

如果您想调试try @PostConstruct

@PostConstruct
  public void someMethodName() {
    System.out.println(p1);
  }

你注入p2(@Value("com.example.property"))的方式是错误的。 p1(@Value("${com.example.property}"))是正确的方法

答案 1 :(得分:0)

在构造函数完成后注入值(你知道,所以构造了对象),所以你当然不会在构造函数中看到任何值。

对于@Autowired属性,您可以切换到构造函数注入,这将允许您至少看到env具有值。也许可以像这样注入@Value属性,但到目前为止还不清楚你是否有问题,或者你只是认为你有问题,因为你看不到在构造函数中注入了值。