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

Posted

技术标签:

【中文标题】如何使用 @ConfigurationProperties 注入 java.nio.file.Path 依赖项【英文标题】:How to inject java.nio.file.Path dependency using @ConfigurationProperties 【发布时间】: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) 的引用。但是,执行此操作时会收到绑定错误。有没有办法将属性绑定到路径(例如通过使用注释)?

【问题讨论】:

【参考方案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();
    

【讨论】:

以上是关于如何使用 @ConfigurationProperties 注入 java.nio.file.Path 依赖项的主要内容,如果未能解决你的问题,请参考以下文章

springboot之多数据源配置JdbcTemplate

vs2010中添加dll文件

在 Spring Boot 中获取对当前活动数据源的引用

[精选] Mysql分表与分库如何拆分,如何设计,如何使用

如果加入条件,我该如何解决。如果使用字符串连接,我如何使用

如何使用本机反应创建登录以及如何验证会话