¿Es posible hacer que la configuración de arranque del resorte trabajo del procesador correctamente con mapas que los valores son estructuras complejas (en IntelliJ IDEA)?

amseager:

El código fuente que reproduce el problema: enlace .

Supongamos que tengo este tipo de estructura de las propiedades de configuración:

    @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;
    }

En application.ymlLes establecer de esta manera:

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

Después de lanzar el procesamiento de anotación sólo las propiedades simples funcionan correctamente (se puede navegar a su declaración haciendo clic con el ctrl, también de autocompletar para ellos funciona). Además, IDEA detecta si la propiedad es incorrecta y lo resalta.

Para las estructuras anidadas (que son valores de mapa) no parecen ambas de estas características para funcionar correctamente. Usted todavía puede hacer clic en ellos, pero idea va a navegar a la declaración mapa. Además, la finalización de código para los valores de mapa y poner de relieve de los campos incorrectos no funcionan.

Captura de pantalla de IDEA:

introducir descripción de la imagen aquí

¿Alguien sabe cómo hacer que funcione correctamente? Siéntase libre de utilizar el código de ejemplo adjunto.

Gracias por adelantado.

Marcos Bramnik:

Creo que estás preguntando por el agregado

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

Esto es básicamente un procesador de anotación - un gancho especial en el proceso de compilación que puede detectar clases anotadas con alguna anotación en tiempo de compilación y generar algunos recursos sobre la base de esa definición. Algunos procesadores de anotación generar otros archivos de origen, sin embargo, éste realiza una introspección de las clases con anotada @ConfigurationPropertiespor la reflexión y basados en el campo nombres y tipos que se encuentran en estas clases se genera un archivo especial JSON (META-INF / primavera-configuración-metadata.json en el targetdirectorio de construcción).

Puede abrirlo y ver cómo es lo que parece.

Ahora, un par de notas en este proceso:

  1. Ya que sucede durante la compilación - no se ve en application.yaml
  2. El JSON generada en general no se utiliza por sí mismo arranque de primavera durante el tiempo de ejecución, pero destinado a entornos de desarrollo para que pudieran construir algunas integraciones ingeniosas. Eso es lo que hace básicamente IntelliJ.

Ahora, IntelliJ (Sólo Ultimate Edition, desde edición de la comunidad no incluye ningún tipo de integración con la primavera) de hecho puede leer este archivo, y proporcionar algunas características de autocompletado.

Pero la base de la información proporcionada en las propiedades de configuración que incluyen mapas de un procesador de anotación (que corre de nuevo durante la compilación y tiene un acceso sólo a la clase) simplemente no puede generar valores correctos de teclas, por ejemplo. Así IntelliJ no ofrecerá que pueda elegir key1, key2puesto que no existen en los archivos de las propiedades de configuración de Java. Es por eso que no funciona. Cubra el fondo, IntelliJ no es culpable, lo hace lo mejor que puede :)

En términos de la resolución:

Hay dos caminos que puede probar:

  1. En lugar de utilizar cadenas como claves, utilizar una enumeración . Ya que tendrá un finito y bien definido conjunto de valores, probablemente el procesador de anotación generará una mejor JSON (si no lo hace - es un error o, más bien una solicitud de mejora, en el procesador de anotación)

  2. Suponiendo que el procesador de anotación hace su mejor trabajo, pero no siempre tiene éxito, se puede definir el JSON manualmente como se describe en la documentación de Primavera de arranque

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=362495&siteId=1
Recomendado
Clasificación