Java 基于活动轮廓自动关联具有不同参数的方法

Java 基于活动轮廓自动关联具有不同参数的方法,java,spring,Java,Spring,使用Spring Boot,我有一个自动连接的方法,如果活动概要文件是本地的,我想从属性文件传入两个变量,但是如果是dev/prod,我只想传入一个变量(由于环境的自动配置,端点不是必需的) 这不起作用,因为spring不知道自动连线的方法。我已经尝试过添加(required=true/false),无论我如何配置required,它仍然会抛出错误。是否有更好的方法添加可选的基于概要文件的参数值 /* * * * * * * * * * * * * * * * * application-lo

使用Spring Boot,我有一个自动连接的方法,如果活动概要文件是本地的,我想从属性文件传入两个变量,但是如果是dev/prod,我只想传入一个变量(由于环境的自动配置,端点不是必需的)

这不起作用,因为spring不知道自动连线的方法。我已经尝试过添加(required=true/false),无论我如何配置required,它仍然会抛出错误。是否有更好的方法添加可选的基于概要文件的参数值

/* * * * * * * * * * * * * * * * * 
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
    }
}
仅使用一个构造函数,并将可选参数移动到字段中。按照惯例,您可以区分哪些参数是该组件必须存在的,哪些是可选的,从而使代码更易于测试和维护

@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
    }
}

使用可注入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
}

完美的看起来,在构造函数中指定自动连接值并不意味着该属性必须存在,如果您像您指出的那样将其设置为默认值为null,那么没有声明它的概要文件只是默认值为null并起作用,您只需负责处理当该属性为null时该做什么的逻辑。