我在春季有一个bean,尝试从属性文件中注入一些值。

对我来说,这不是一个不寻常的任务,我已经多次这样做而没有错误,但是现在,我有了这段代码

@Component("cmHeaderChecker")
public class CustomerManagementHeaderChecker extends AbstractHeaderChecker {

private static Logger LOGGER = Logger.getLogger(CustomerManagementHeaderChecker.class);

protected String fileSeparator;

@Value("${customerManagement.file.input.separator}")
public void setFileSeparator(String separator) {
    LOGGER.error("set separator");
    this.fileSeparator = separator;
    super.setSeparator(separator);
}

@Value("${customerManagement.file.input.headers}")
public void setExpectedHeader(String expectedHeader) {
    LOGGER.error("set header");
    super.setExpectedHeader(expectedHeader.split(normalizeSplitter(fileSeparator)));
}

@javax.annotation.Resource(name = "cmReportGenerator")
public void setReportGenerator(ReportGenerator reportGenerator) {
    super.setReportGenerator(reportGenerator);
}
}


如果我在调试模式下运行此代码,则在fileSeparator之前设置expectedHeader,并且一切正常

如果我在运行模式下运行此代码,则在fileSeparator之前未设置expectedHeader,并且会引发空指针异常

我在理解这一点上有些麻烦。能请您提供一些解释吗



如果我更改以下方法,则无论哪种方式,它都可以在运行和调试模式下工作,但这仍然不能解释非常奇怪的行为。我现在不太喜欢二传手

@Value("${customerManagement.file.input.separator}")
protected String fileSeparator;

@Value("${customerManagement.file.input.headers}")
public void setExpectedHeader(String expectedHeader) {
    LOGGER.error("set header");
    super.setSeparator(fileSeparator);
   super.setExpectedHeader(expectedHeader.split(normalizeSplitter(fileSeparator)));
}

最佳答案

Java / Spring在此上下文中不保证任何排序。因此,您不应依赖可预测的顺序。

最好的选择是从参数的设置器中删除所有逻辑(它们应仅用于设置值),然后将该逻辑放入@PostConstruct中。

保证所有参数值都设置好后,PostConstruct才能运行。

10-08 15:26