【问题标题】:Micronaut: How do I map all the properties values in HashMap?Micronaut:如何映射 HashMap 中的所有属性值?
【发布时间】:2021-01-09 20:55:54
【问题描述】:

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

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

output:
    -file:
        name: PDF
        size: 50000
    -file:
        name: DOCX
        size: 35000

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

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

非常感谢任何帮助。

【问题讨论】:

  • 您能补充一下到目前为止您尝试实现的目标吗?你是如何配置你的 bean 工厂的,它会带来什么结果?

标签: java dependency-injection microservices micronaut


【解决方案1】:

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

使用@EachProperty 配置时要考虑的重要说明它只绑定到顶级配置键,即创建的 bean 将被命名在嵌套的 top Higher 属性之后,该属性应该是唯一的。

除非更改为以下内容,否则您的配置将不起作用:

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

请注意,在上述配置中,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 +
                '}';
    }
}

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

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

由于这些 bean 已经由 micronaut 核心容器处理,您可以将它们注入任何其他 bean。

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

  1. 创建另一个 Singleton bean 作为配置包装器
  2. 注入FileType bean
  3. 将注入的 FileType bean 映射到您的自定义格式
  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;
    }
}

通过FileTypeConfiguration#getFileTypes 访问您的配置(FileTypeConfiguration 必须是@Injected 或通过ApplicationContext 访问)。

【讨论】:

  • EachProperty 也可以使用列表 (@EachProperty(list = true)),仅供参考
  • 感谢@tmarwen,拯救了这一天。一切看起来都很好,在我的项目中运行良好。虽然我不明白为什么要在 FileTypeConfiguration 构造函数上添加注入。我不确定那里的目的是什么,也许我完全不知道这个概念。也感谢詹姆斯的意见。
  • @JamesKleeh 感谢您提供额外的见解。我已经知道该属性功能,但由于它可能会导致帖子主题混淆,因此我省略了提及它。 @RobinSingh,您可以省略它,因为 micronaut 会自动连接您的依赖项(FileType bean),这只是一个偏好问题(我总是希望读者清楚这个 @987654340 @ 是一个注入点)。欢迎您并乐于提供帮助。
猜你喜欢
  • 2014-07-12
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多