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

有没有可能让Spring Boot配置处理器正确地处理那些值是复杂结构的映射(在Intellij IDEA中)?

沈弘盛
2023-03-14

重现问题的源代码: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;
    }

应用程序中。yml我是这样设置的:

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

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

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

IDEA的截图:

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

提前谢谢。

共有2个答案

蓬运诚
2023-03-14

根据当前关于自动完成代码的文档,IntelliJ IDEA不会建议您下一个可能的密钥,也不会通知您错误的值,例如SomErrorProperty或SomeInnerErrorProperty

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

>

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

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

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

    文件|设置|编辑器|代码样式|适用于Windows和Linux的YAML
    IntelliJ IDEA |首选项|编辑器|代码样式|适用于macOS的YAMLCtrl-Alt S

    插件

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

  • 贺文彬
    2023-03-14

    我相信你是在问关于

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

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

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

    下面是关于这个过程的几个注意事项:

    1. 因为它发生在编译过程中,所以它不会查看应用程序。yaml
    2. 生成的JSON通常不会在运行时由spring boot本身使用,而是用于IDE,以便它们可以构建一些漂亮的集成。IntelliJ基本上就是这么做的

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

    但是,基于包含映射的配置属性中提供的信息,注释处理器(在编译过程中再次运行,并且只能访问类)仅仅无法生成正确的键值。因此IntelliJ不会让您从key1key2中进行选择,因为它们不存在于配置属性java文件中。这就是它不起作用的原因。总之,IntelliJ是无罪的,它尽了最大努力:)

    在决议方面:

    有两条路可以尝试:

    >

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

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

  •  类似资料:
    • 在Spring的上个版本中,用户需要在web应用的上下文中定义一个或多个的HandlerMappingbean,用以将进入容器的web请求映射到合适的处理器方法上。允许在控制器上添加注解后,通常你就不必这么做了,因为RequestMappingHandlerMapping类会自动查找所有注解了@RequestMapping的@Controller控制器bean。同时也请知道,所有继承自Abstra

    • 但这不是有效的语法。 我是否必须分别检查每一个密钥才能处理无的情况?

    • 17.5. 处理器映射 通过处理器映射,可以把进来的portlet请求对应到合适的处理器上。已经有一些 现成的处理器映射可以使用,比如PortletModeHandlerMapping。 但还是让我们先看一下HandlerMapping的一般概念。 注意,我们这里有意使用“处理器”来代替“控制器”。 DispatcherPortlet是设计用来和多种方式一起处理请求的, 而不仅仅是和Spring

    • 我有一个spring-boot应用程序,没有任何控制器类。如何为该应用程序编写异常处理程序。用@ControllerAdvice注释的异常处理程序类不起作用。

    • 我已经尝试将文档保存为PDF,看起来不错。保存图像时,图像可能包含不正确的文本。东欧文件尤其如此,如匈牙利、波兰、捷克等 PDF显示 有没有解决办法?我需要定义代码页吗?可用字体可能有问题吗?

    • 14.4. 处理器映射(handler mapping) 通过处理器映射,你可以将web请求映射到正确的处理器(handler)上。Spring内置了很多处理器映射策略,例如:SimpleUrlHandlerMapping或者BeanNameUrlHandlerMapping。现在我们先来看一下HandlerMapping的基本概念。 HandlerMapping的基本功能是将请求传递到Handl