본문 바로가기

IDE/IntelliJ IDEA

[spring boot] yml 파일 Can not resolve configuration property 처리하기

답변은 : https://stackoverflow.com/questions/48954087/intellij-idea-complains-cannot-resolve-spring-boot-properties-but-they-work-fine 에 잘 나와 있다.

공식적인 레퍼런스는 https://docs.spring.io/spring-boot/docs/current/reference/html/configuration-metadata.html 참고

  • META-INF/spring-configuration-metadata.json
  • META-INF/additional-spring-configuration-metadata.json


누군가 Inspection을 끄라고 하는데 이것은 좋은 방법이 아닌 것 같다. 인스펙션은 사용자의 실수를 막기 위한 기능인데 보기 싫다고 끄는 것은 문제가 있는 설정에 대해 통지를 받을 수 없기 때문이다.


대신 답변중 하나는 @ConfigurationProperties 를 이용하는 것인데 이것보다는 후자가 좋아 보인다.

src/main/resources/META-INF/spring-configuration-metadata.json 파일을 만들어서 커스텀 프로퍼티를 정의하는 것이다.

{
"properties": [
{
"name": "aws.accessKey",
"type": "java.lang.String"
},
{
"name": "aws.secretKey",
"type": "java.lang.String"
}
]
}


참고할 만 한 한글 블로그: http://wonwoo.ml/index.php/post/1599


다른 방법

@ConfigurationProperties 를 사용해서 프로퍼티 클래스를 만들면 자동으로 이 문제를 해결해준다.
애너테이션 프로세스가 자동으로 spring-configuration-metadata.json 파일을 만들어준다.
위에서 설명한 spring-configuration-metadata.json 파일은 resources/META-INF 하위에 있지만 지금 생성되는 것은 classes/META-INF 하위에 생겼다.

다만 이렇게 하기 위해서는 maven이나 gradle 설정에 의존성을 추가해주어야 한다. (아래는 gradle 4.5 이후에 추가된 annotaionProcessor)

dependencies {
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"


추가적으로 @EnableConfigurationProperties 가 활성화되어 있어야 하고, @ConfigurationProperties 붙은 클래스를 등록할 수 있게 값으로 넣어주어야 한다.
빠르게 등록하기 위해 경로를 지정하지 않고 Class를 지정함에 주의한다.

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(EnableConfigurationPropertiesImportSelector.class)
public @interface EnableConfigurationProperties {

/**
* Convenient way to quickly register {@link ConfigurationProperties} annotated beans
* with Spring. Standard Spring Beans will also be scanned regardless of this value.
* @return {@link ConfigurationProperties} annotated beans to register
*/
Class<?>[] value() default {};

}

예)

@Configuration
@EnableConfigurationProperties(MyProperties.class)
public class MyPropertiesConfig {
}