当前位置: 首页 > 知识库问答 >
问题:

无法使用@ConfigurationProperties从spring boot yaml文件中使用复杂键绑定映射

戚弘和
2023-03-14

我试图用一个复杂的键将映射从spring yaml配置文件解包到java。util。使用spring boot和@ConfigurationProperties注释进行映射。有很多关于带有简单键的地图的示例,如

map: 
  key: value

甚至可以使用简单的键和复杂的值进行映射,如

map:
  key: {firstPartOfComplexValue: alpha, secondPartOfComplexValue: beta}

我已经测试了以上两个示例-效果良好。

现在我需要一个地图中的复杂键:

map:
  ? {firstPartOfAKey: someValue1, secondPartOfAKey: someValue2}: value

这种解组的结果是一个空映射。你能告诉我我做错了什么吗提前谢谢

这是我的代码:

应用yml公司

custom:
  users:
    ? {firstPartOfAKey: hello, secondPartOfAKey: world} : tom

bean到解组

@Component
@ConfigurationProperties("custom")
  public class MyBean {
    private Map<Key, String> users = new HashMap<>();

    public Map<Key, String> getUsers() {
      return users;
    }

    public void setUsers(Map<Key, String> users) {
      this.users = users;
    }

    @Override
    public String toString() {
      return users.toString();
    }

    public static class Key {
      private String firstPartOfAKey;
      private String secondPartOfAKey;

      @Override
      public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Key key = (Key) o;
        return Objects.equals(firstPartOfAKey, key.firstPartOfAKey) &&
                Objects.equals(secondPartOfAKey, key.secondPartOfAKey);
      }

      @Override
      public int hashCode() {
        return Objects.hash(firstPartOfAKey, secondPartOfAKey);
      }

      public String getFirstPartOfAKey() {
        return firstPartOfAKey;
      }

      public void setFirstPartOfAKey(String firstPartOfAKey) {
        this.firstPartOfAKey = firstPartOfAKey;
      }

      public String getSecondPartOfAKey() {
        return secondPartOfAKey;
      }

      public void setSecondPartOfAKey(String secondPartOfAKey) {
        this.secondPartOfAKey = secondPartOfAKey;
      }

      @Override
      public String toString() {
        return String.format("firsPartOfKey: '%s', secondPartOfKey: '%s'", firstPartOfAKey, secondPartOfAKey);
      }
    }
}

Java配置(为空)

@Configuration
@ComponentScan(basePackages = {"com"})
@EnableAutoConfiguration
@EnableConfigurationProperties
public class Config {
}

单元测试

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {Config.class})
public class TestProps {

    @Autowired
    private MyBean myBean;

    @Test
    public void testYamlPropsLoad() {
      System.out.println(myBean);
    }
}

测试仅使用复杂键打印地图的{}。其他地图(使用简单键)运行良好。

共有1个答案

沈宇定
2023-03-14

如果测试执行时没有任何异常,那么MyBean的绑定似乎根本不会被处理,通常会出现如下异常:

绑定到目标{}失败:

属性:自定义。null值:{{firstPartOfAKey=hello,secondPartOfAKey=world}=tom}原因:无法转换“java”类型的属性值。lang.String“到所需类型”com。实例属性“null”的MyBean$Key;嵌套异常为java。lang.IllegalStateException:无法转换“java”类型的值。lang.String“到所需类型”com。实例MyBean$键:未找到匹配的编辑器或转换策略

显然,解析器无法处理复杂的键,并且正在解释键null和值{firstPartOfAKey=hello,secondPartOfAKey=world}=tom。

也许您可以通过实现自定义编辑器/转换器找到另一种处理配置的方法

 类似资料:
  • 我正在尝试设置下拉的默认值,我设置了一个默认值的模型,但它没有更新选择 请参阅此https://plnkr.co/edit/bnm5yxx78iykv2Opazol?p=preview

  • 最d、 ts文件很容易使用,jQuery。d、 例如ts。但现在我遇到了chrome应用程序。d、 (对我来说!)如何导入此打字文件。chrome应用程序。d、 ts由一系列模块定义组成,每个模块定义包含接口和导出的函数。这里有一个剪报: 以此类推,共七个模块。未引用模块名称。没有顶级出口申报。 如何在ts中使用(即导入)此定义文件?我想用chrome。应用程序。窗get()等等,继续使用Goog

  • 问题内容: 我有一个深层的XML结构,其中包含许多没有意义的包装程序,我将它们映射到一个Java类。使用@XmlPath映射简单的数据类型是在公园里散步,但是当涉及到实际上需要自己的类的类型时,我不太确定该怎么做,尤其是当这些类型也应该放在列表中时。 我在将以下示例中的所有类型映射到我的类时遇到问题。由于包装器驻留在使用I 映射的资源中,因此我不能使用,否则我通常会这样做。 示例XML结构 根ja

  • 我有一个很深的XML结构,它有很多无意义的包装器,我要映射到一个Java类。用@xmlpath映射简单的数据类型是一种尝试,但当涉及到实际上需要自己的类的类型时,我不太确定该如何做,特别是当这些类型也应该放在列表中时。 XML结构示例 root.java RefObj.java 更新 在发布了前面的示例之后,我意识到它实际上是按照预期工作的,这让我更加困惑。尽管我试图在生产代码中复制(以前的)工作

  • 根据Spring Boot integration tests不读取属性文件的建议,我创建了以下代码,目的是从我的JUnit测试中的属性读取映射。(我使用的是yml格式,并且使用@configurationproperties而不是@value) 我的测试配置(在application-test.yml中): 奇怪的是,弦“起作用了!”从配置文件中成功读取,但未填充映射。 注意:添加映射设置程序会

  • 问题内容: 例如,我有简单的DF: 我可以使用熊猫的方法和惯用法从中选择与B对应的值大于50的值,对于对应的值大于900的值吗? 问题答案: 当然!设定: 我们可以应用列操作并获取布尔系列对象: [更新,切换到新样式.loc]: 然后,我们可以使用它们来索引对象。对于读取访问,可以链接索引: 但是由于视图和执行写操作的副本之间的差异,您可能会遇到麻烦。您可以.loc改用: 请注意,我不小心输入了=