使用Spring Boot,我有一个自动装配的方法,如果活动配置文件是本地的,我想从属性文件中传入两个变量,但是如果它是dev / prod我只想传入一个变量(端点是由于环境的自动配置而需要。
这不起作用,因为spring不知道自动装配哪种方法。我已经玩过添加(required = true / false),无论我如何配置所需,它仍然会抛出错误。有没有更好的方法来添加可选的基于配置文件的参数值?
/* * * * * * * * * * * * * * * * *
application-local.properties
company.group.endpoint=http://localhost:8000/
company.group.version=/v2
* * * * * * * * * * * * * * * * *
application-dev.properties
company.group.version=/v3
* * * * * * * * * * * * * * * * *
*/
// Worker.java
@Component
public class Worker {
private String endpoint;
private String version;
@Autowired
public Worker(@Value("${company.group.version}") String version) {
this.version = version;
// do work
}
@Autowired
public Worker(@Value("${company.group.version}") String version,
@Value("${company.group.endpoint}") String endpoint) {
this.version = version;
this.endpoint = endpoint;
// do work
}
}
答案 0 :(得分:2)
使用可注入bean重载构造函数并不像pojo类那样简单 确实,Spring并不知道应该调用哪个构造函数。
因此,另一种方法是使用单个自动装配的构造函数
您可以通过指定默认值(例如null
:
@Autowired
public Worker(@Value("${company.group.version}") String version,
@Value("${company.group.endpoint:#{null}}") String endpoint) {
this.version = version;
this.endpoint = endpoint;
// do work
}
答案 1 :(得分:1)
仅使用一个构造函数,并将可选参数移动到字段中。按照惯例,您可以分离出该组件必须存在的参数,以及可选的参数,使您的代码更容易测试和维护。
@Component
public class Worker {
@Value("${company.group.endpoint:@null}")
private String endpoint;
private String version;
@Autowired
public Worker(@Value("${company.group.version}") String version) {
this.version = version;
// do work
}
}