Micronaut:如何映射 HashMap 中的所有属性值?

Rob*_*ngh 6 java dependency-injection microservices micronaut

我一直在为了学习和一个小规模项目而学习 micronaut,但我一直遇到一个问题。

所以假设我在application.yml文件中有这些数据

output:
    -file:
        name: PDF
        size: 50000
    -file:
        name: DOCX
        size: 35000
Run Code Online (Sandbox Code Playgroud)

所以我的目标是将这些精确的数据映射到 HashMap 中,我可以进一步使用它。我希望我的代码具有独立于任何条件的所有数据。如果我添加另一种文件类型,它也应该自动映射该文件类型的数据。简而言之,最后我想要一个Map<name, path> ,其中包含 yaml 中可用的所有值。我尝试过 EachProperty。

https://guides.micronaut.io/micronaut-configuration/guide/index.html#eachProperty 但我必须传递“名称”作为参数。

任何帮助深表感谢。

tma*_*wen 6

micronaut允许驱动应用程序属性的创建,因此它将创建具有从嵌套配置键/值派生的属性的 bean (POJO) @EachPropertyBeanSingleton

使用配置时要考虑的一个重要注意事项@EachProperty是,它仅绑定到顶级配置键,即,创建的 bean 将以嵌套的顶级属性命名,该属性应该是唯一的。

除非更改为以下内容,否则您的配置将无法工作:

output:
  # Below config will drive a bean named "pdf", more details below
  pdf:
    size: 50000
  # Below config will drive a bean named "docx"
  docx:
    size: 35000
Run Code Online (Sandbox Code Playgroud)

请注意,在上面的配置中,该name属性被省略,因为它可以从 bean 配置名称本身派生:

@EachProperty(value = "output")
public class FileType {

    private String name;

    private int size;

    public FileType(@Parameter("name") String name) {
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public int getSize() {
        return size;
    }

    @Override
    public String toString() {
        return "FileType{" +
                "name='" + name + '\'' +
                ", size=" + size +
                '}';
    }
}
Run Code Online (Sandbox Code Playgroud)

构造函数FileType将注入已配置的 bean 名称(从配置键派生),并且上述类型将在应用程序运行时生成两个 bean:

文件类型{name='pdf',大小=50000} 文件类型{name='docx',大小=35000}

由于这些 Bean 已由micronaut核心容器处理,因此您可以将它们注入到任何其他 Bean 中。

否则,如果您希望将 beans 映射到特定的配置格式(例如 a )Map [NAME -> SIZE],您可以:

  1. 创建另一个Singletonbean 作为配置包装器
  2. 注入FileType豆子
  3. 将注入的FileTypeBean 映射到您的自定义格式
  4. 使您的配置包装器可以访问此自定义格式

下面是一个示例配置包装器:

@Singleton
public class FileTypeConfiguration {

    private final Map<String, Integer> fileTypes;

    @Inject
    public FileTypeConfiguration(List<FileType> fileTypes) {
        this.fileTypes = fileTypes.stream()
                .collect(
                        Collectors.toMap(FileType::getName, FileType::getSize)
                );
    }

    public Map<String, Integer> getFileTypes() {
        return fileTypes;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式访问您的配置FileTypeConfiguration#getFileTypesFileTypeConfiguration必须@Inject通过 ed 或访问ApplicationContext)。