我正在使用Spring Boot并具有以下Component类:
@Component
@ConfigurationProperties(prefix="file")
public class FileManager {
private Path localDirectory;
public void setLocalDirectory(File localDirectory) {
this.localDirectory = localDirectory.toPath();
}
...
}
以下yaml属性文件:
file:
localDirectory: /var/data/test
我想通过替换java.nio.file.Path来删除java.io.File(setLocalDirectory)的引用。但是,当我这样做时,我收到一个绑定错误。有没有办法将属性绑定到路径(例如通过使用注释)?
我不知道是否有注释方法,但您可以在您的应用中添加转换器。在启用了@ComponentScan的情况下将其标记为@Component可以正常工作,但您可能必须使用其他方式将其正确注册到ConversionService。
@Component
public class PathConverter implements Converter<String,Path>{
@Override
public Path convert(String path) {
return Paths.get(path);
}
当Spring看到你想要一个Path但它有一个String(来自你的application.properties)时,它会在其注册表中查找并发现它知道如何去做。
要添加到上面的jst答案,Spring引号注释@ConfigurationPropertiesBinding可用于Spring Boot以识别转换器的属性绑定,如24.7.4 Properties Conversion中所述:
@Component
@ConfigurationPropertiesBinding
public class StringToPathConverter implements Converter<String, Path> {
@Override
public Path convert(@NonNull String pathAsString) {
return Paths.get(pathAsString);
}
}
我接受了詹姆斯的想法并在spring boot配置中定义了转换器:
@SpringBootConfiguration
public class Configuration {
public class PathConverter implements Converter<String, Path> {
@Override
public Path convert(String path) {
return Paths.get(path);
}
}
@Bean
@ConfigurationPropertiesBinding
public PathConverter getStringToPathConverter() {
return new PathConverter();
}
}