6

重现问题的源代码:链接

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

    @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 将导航到地图声明。此外,地图值的代码完成和错误字段的突出显示不起作用。

IDEA的截图:

在此处输入图像描述

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

提前致谢。

4

2 回答 2

1

根据auto-completing-code 的当前文档, IntelliJ IDEA不会向您建议下一个可能的密钥并通知您错误的值,例如somWrongPropertysomeInnerWrongProperty

我发现对上述用例有些相关和有用的是将插入符号处的字符串扩展为现有单词

  • 按 Alt+/ 或选择代码 | 完成 | 循环展开单词以在插入符号之前搜索匹配的单词。

  • 按 Shift+Alt+/ 或选择代码 | 完成 | 循环展开单词(向后)以在插入符号之后和其他打开的文件中搜索匹配的单词。

在此处输入图像描述


代码风格。YAML 我们可以自定义 YAML 的代码样式如下,但是上面的用例没有自动完成和错误选项

文件 | 设置 | 编辑 | 代码风格 | 适用于 Windows 和 Linux 的 YAML
IntelliJ IDEA | 偏好 | 编辑 | 代码风格 | 适用于 macOS 的 YAML Ctrl+Alt+S


插件

此外,我已经通过插件来实现用例,并且有一些有用的插件可以将属性转换为 yaml,但与用例无关。您可能需要等待或创建类似类型的插件。您可能会发现很有帮助

在此处输入图像描述

于 2020-01-17T17:53:05.603 回答
1

我相信你问的是添加的

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

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

你可以打开它看看它是什么样子的。

现在对这个过程有几点说明:

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

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

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

在分辨率方面:

您可以尝试两种路径:

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

  2. 假设注释处理器做得最好,但并不总是成功,您可以按照Spring Boot 文档中的描述手动定义 json

于 2020-01-24T05:19:04.193 回答