8

我正在使用 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 (of setLocalDirectory) 的引用。但是,执行此操作时会收到绑定错误。有没有办法将属性绑定到路径(例如通过使用注释)?

4

3 回答 3

7

要添加到上面的 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);
  }
}
于 2018-09-17T08:56:35.653 回答
6

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

于 2015-06-25T19:10:20.113 回答
2

我接受了 james 的想法,并在 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();
    }
}
于 2019-03-28T16:20:50.480 回答