我正在开发一个基于Micronaut 2.5.13的应用程序.当我必须将一个字符串值映射到另一个字符串值时,我有一个要求,这样我就可以在我的应用程序逻辑中替换它.

我在application.yaml中创建了这样的属性

myapp:
  mapping:
  enabled: true
  mappings:
    a: b
    c: d

我希望在我的服务类中将映射值作为映射读取,如下所示:

import io.micronaut.context.annotation.Value;
import javax.inject.Singleton;
import java.util.Map;

@Context
public class MappingService {

    private final boolean mappingEnabled;
    private final Map<String, String> mappings;

    public MappingService(
            @Value("${myapp.mapping.enabled}") boolean mappingEnabled,
            @Value("${myapp.mapping.mappings}") Map<String, String> mappings
    ) {
        this.mappingEnabled = mappingEnabled;
        this.mappings = mappings;
    }

    public String mapValue(String key) {
        if (mappingEnabled) {
            return mappings.getOrDefault(key, key); // If key not found, return the original key
        } else {
            return key; // Mapping is disabled, return the original key
        }
    }
}

当我try 运行上面的代码时,出现以下错误:

 Error resolving property value [${myapp.mapping.mappings}]. Property doesn't exist

似乎Micronaut无法识别YAML中的映射类型属性.应用程序正在成功读取另一个布尔类型的属性myapp.mapping.enabled.

对此有何建议?

问候

推荐答案

在Micronaut中,您可以使用@EachProperty批注将一组属性映射到List

在本例中,您也许可以创建一个名为GatewayString的Bean,并使用@EachProperty

@EachProperty("myapp.mapping.mappings")
public class GatewayString{
    private String from;
    private String to;

   public String getFrom() {
    return from;
   }

   public void setFrom(String from) {
    this.from = from;
   }

   public String getTo() {
    return to;
   }

   public void setTo(String to) {
    this.to = to;
   }
}

然后你可以在你的服务中使用它

@Singleton
public class MappingService {
   private final boolean mappingEnabled;
   private final List<GatewayString> mappings;

   public MappingService(
        @Value("${myapp.mapping.enabled}") boolean mappingEnabled,
        List<GatewayString> mappings
   ) {
    this.mappingEnabled = mappingEnabled;
    this.mappings = mappings;
   }

   public String mapValue(String key) {
    if (mappingEnabled) {
        return mappings.stream()
            .filter(mapperString ->mapperString.getFrom().equals(key))
            .map(MapperString::getTo).findFirst().orElseThrow(() -> new RuntimeException("Key not found"));
    } else {
        return key; // Mapping is disabled, return the original key
    }
}
}

此外,您还可以查看此答案Micronaut: How do I map all the properties values in HashMap?

Java相关问答推荐

是否可以从@ TrustMapping中删除特定方法的基路径?

try Dockerize Maven应用程序,但发布版本21不支持"

Java 22模式匹配不适用于记录模式匹配.给出汇编问题

Springdoc Whitelabel Error Page with Spring V3

如何在Javascript中设置文本区域圆角的样式

如何使用jooq generator将表名和列名映射为人类可读的?

有关手动创建的包的问题

在模拟超类中设置非setter属性的值

JDK 21-为什么线程局部随机S nextInt不直接用Super.nextInt实现?

有没有更快的方法在N个容器中删除重复项?

如何只修改父类ChroniclerView位置0处的第一个嵌套ChroniclerView(child)元素?

为什么我的回收视图会显示重复的列表?

有没有可能在时间范围内得到多种解决方案?

Java创建带有扩展通配符的抽象处理器

从12小时开始的日期模式

如何在Struts2中使用操作类中的结果注释重定向到不同的命名空间

spring 更新多项管理关系

ResponseEntity.控制器截断响应的JSON部分

java中的网上购物车解析错误

在不带instanceof或switch的java中记录模式