我创建了一个简单的示例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
。
当应用程序运行并且我在服务的构造函数中放置了一个断点时,p1
,p2
和env
为null
。关于如何调试这个的任何建议?
答案 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
属性,但到目前为止还不清楚你是否有问题,或者你只是认为你有问题,因为你看不到在构造函数中注入了值。