【问题标题】:How to inject java.nio.file.Path dependency using @ConfigurationProperties如何使用 @ConfigurationProperties 注入 java.nio.file.Path 依赖项
【发布时间】:2015-09-12 12:37:37
【问题描述】:

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

【问题讨论】:

    标签: spring spring-boot properties-file java.nio.file


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我把它放到了一个@Configuration 类中,并把Converter 变成了一个bean (@Bean)。使用Spring Boot 进行注册
      【解决方案3】:

      我接受了 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();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-11-22
        • 1970-01-01
        • 1970-01-01
        • 2011-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多