gpt4 book ai didi

java - 是否可以使 Spring Boot 配置处理器与值是复杂结构的映射正常工作(在 Intellij IDEA 中)?

转载 作者:行者123 更新时间:2023-11-30 01:42:39 30 4
gpt4 key购买 nike

重现问题的源代码:link .

假设我有这种配置属性结构:

    @Data
@ConfigurationProperties(prefix = "props")
public class ConfigProperties {

private String testString;
private Map<String, InnerConfigProperties> testMap;
}
    @Data
public class InnerConfigProperties {

private String innerString;
private Integer innerInt;
}

application.yml中,我以这种方式设置它们:

props:
testString: asdadasd
somWrongProperty: asdasd
testMap:
key1:
innerString: value1
innerInt: 1
someInnerWrongProperty: wrongvalue
key2:
innerString: value2
innerInt: 2

启动注释处理后,只有简单的属性可以正常工作(您可以通过单击ctrl导航到它们的声明,它们的自动完成也可以工作)。此外,IDEA 还会检测属性是否不正确并突出显示它。

对于嵌套结构(即映射值),这两个功能似乎都无法正常工作。您仍然可以单击它们,但 IDEA 将导航到 map 声明。此外, map 值的代码完成和错误字段的突出显示不起作用。

IDEA 的屏幕截图:

enter image description here

有人知道如何让它正常工作吗?请随意使用随附的示例代码。

提前致谢。

更新

似乎已在 Intellij IDEA 2022.1 中修复。相关问题:IDEA-151708IDEA-159276 .

尽管如此,错误修复效率还是不错的。

最佳答案

我相信您是在询问添加的内容

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

这基本上是一个注释处理器 - 编译过程中的一个特殊 Hook ,可以在编译时期间检测用某些注释注释的类,并根据该定义生成一些资源。一些注释处理器会生成其他源文件,但是这个文件会内省(introspection)用 @ConfigurationProperties 注释的类。通过反射并根据在此类中找到的字段名称和类型,它会生成一个特殊的 json 文件(target 构建目录中的 META-INF/spring-configuration-metadata.json)。

您可以打开它,看看它是什么样子。

现在有一些关于此过程的注释:

  1. 由于它发生在编译期间 - 它不会查看 application.yaml
  2. 生成的 JSON 通常不会在运行时由 Spring Boot 本身使用,而是用于 IDE,以便它们可以构建一些漂亮的集成。这就是 IntelliJ 基本上所做的事情。

现在,IntelliJ(仅限终极版,因为社区版不包含与 spring 的任何集成)确实可以读取此文件,并提供一些自动完成功能。

但是根据包含 map 的配置属性中提供的信息,注释处理器(在编译期间再次运行并且只能访问该类)仅仅无法生成正确的键值例子。因此 IntelliJ 不会为您提供选择 key1 , key2 ,因为它们不存在于配置属性 java 文件中。这就是为什么它不起作用。底线是,IntelliJ 没有罪,它已经尽力了:)

就分辨率而言:

您可以尝试两条路径:

  1. 不要使用字符串作为键,使用枚举。由于它将具有一组有限且定义良好的值,因此注释处理器可能会生成更好的 json(如果没有 - 它是注释处理器中的错误,或者更确切地说是增强的请求)

  2. 假设注释处理器尽了最大努力,但并不总是成功,您可以按照 Spring Boot Documentation 中所述手动定义 json。

关于java - 是否可以使 Spring Boot 配置处理器与值是复杂结构的映射正常工作(在 Intellij IDEA 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59426567/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com