如何使用@ConfigurationProperties 注入 java.nio.file.Path 依赖项

Jam*_*mes 8 spring properties-file java.nio.file spring-boot

我正在使用 Spring Boot 并具有以下组件类:

@Component
@ConfigurationProperties(prefix="file")
public class FileManager {

    private Path localDirectory;

    public void setLocalDirectory(File localDirectory) {
        this.localDirectory = localDirectory.toPath();
    }

...

}
Run Code Online (Sandbox Code Playgroud)

以及以下 yaml 属性文件:

file:
     localDirectory: /var/data/test
Run Code Online (Sandbox Code Playgroud)

我想通过替换为 java.nio.file.Path 来删除 java.io.File(setLocalDirectory)的引用。但是,执行此操作时收到绑定错误。有没有办法将属性绑定到路径(例如,通过使用注释)?

jst*_*jst 6

我不知道是否有注释的方法,但您可以向您的应用程序添加一个转换器。将其标记为启用 @ComponentScan 的 @Component 有效,但您可能必须尝试将其正确注册到 ConversionService 否则。

@Component
public class PathConverter implements Converter<String,Path>{

 @Override
 public Path convert(String path) {
     return Paths.get(path);
 }
Run Code Online (Sandbox Code Playgroud)

当 Spring 看到您想要一个 Path 但它有一个 String(来自您的 application.properties)时,它会在其注册表中查找并发现它知道如何去做。


Seb*_*ian 6

要添加到上面的 jst 答案中,Spring Boot 注释@ConfigurationPropertiesBinding可用于 Spring Boot 以识别用于属性绑定的转换器,如Properties Conversion下的文档中所述:

@Component
@ConfigurationPropertiesBinding
public class StringToPathConverter implements Converter<String, Path> {

  @Override
  public Path convert(String pathAsString) {
    return Paths.get(pathAsString);
  }
}
Run Code Online (Sandbox Code Playgroud)