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.yml
Les 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:
¿Alguien sabe cómo hacer que funcione correctamente? Siéntase libre de utilizar el código de ejemplo adjunto.
Gracias por adelantado.
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 @ConfigurationProperties
por 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 target
directorio de construcción).
Puede abrirlo y ver cómo es lo que parece.
Ahora, un par de notas en este proceso:
- Ya que sucede durante la compilación - no se ve en
application.yaml
- 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
, key2
puesto 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:
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)
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