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

问题描述 投票:4回答:3

我正在使用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)的引用。但是,当我这样做时,我收到一个绑定错误。有没有办法将属性绑定到路径(例如通过使用注释)?

spring spring-boot properties-file java.nio.file
3个回答
3
投票

我不知道是否有注释方法,但您可以在您的应用中添加转换器。在启用了@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)时,它会在其注册表中查找并发现它知道如何去做。


2
投票

要添加到上面的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);
  }
}

0
投票

我接受了詹姆斯的想法并在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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.