Reputation: 1955
Can not resolve configuration property '...
I have no problem accessing my properties through the @Value annotation or through an autowired Evironment. But all of my own defined properties get this warning in IDEA. What should I be doing to get IDEA to recognize these and not bother me?
Upvotes: 124
Views: 109743
Reputation: 200
Spring Boot 3+ in application.properties
you can use:
spring.ldap.urls=192.168.1.1 # instead of spring.ldap.url
spring.ldap.base=dc=example,dc=com
spring.ldap.username=uid=admin,ou=system
spring.ldap.password=secret
Upvotes: 0
Reputation: 7563
As an additional requirement for the answers above. After Spring-boot 2.2 you can use final
keyword on the attributes together with the annotation @ConstructorBinding
in order to see IntelliJ auto-complete the property name on the application.properties
file. IntelliJ also recognizes if you add a java docs on the attribute.
@ConfigurationProperties(prefix = "my-config")
@ConstructorBinding
public class ConfigImportService {
/**
* the name of the bucket
* (IntelliJ shows this comment on the application.properties file)
*/
private final String bucketName;
private final String databaseName;
@Autowired
public ConfigImportService(
@Value("${bucket.name}") String bucketName,
@Value("${db.name}") String databaseName
) {
this.bucketName = bucketName;
this.databaseName = databaseName;
}
}
And still necessary the dependency, of course.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
Upvotes: 0
Reputation: 3387
A Gradle-based workaround is this:
afterEvaluate {
val kaptKotlinTasks = tasks.named("kaptKotlin") {
doLast {
val kaptKotlin = this
tasks.named<ProcessResources>("processResources") {
from(kaptKotlin.outputs) {
include("META-INF/spring-configuration-metadata.json")
}
}
}
}
tasks.named("processResources") {
this.dependsOn(kaptKotlinTasks)
}
}
After running a build (or just the processResources
task) from the Intellij Gradle panel, the warnings about the properties should disappear.
Not ideal, but IntelliJ not supporting kapt is not ideal either :-/
Upvotes: 0
Reputation: 99
I had the same problem plus not showing auto completion found out that it works with IntelliJ Ultimate edition and not community version. link
couple of useful steps to take would be:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
target/classes/META-INF/spring-configuration-metadata.js
to prevent errors.@ConfigurationProperties("name-here")
and that you have enabled it by @EnableConfigurationProperties(NameOfTheConfigClass.class)
Upvotes: 1
Reputation: 3689
Please use the following for Gradle Kotlin Script for Kotlin project:
plugins {
kotlin("jvm")
kotlin("kapt")
}
/* ... */
dependencies {
val configurationProcessor ="org.springframework.boot:spring-boot-configuration-processor:${BuildConstants.springBootVersion}"
kapt(configurationProcessor) // for jar
kaptTest(configurationProcessor) // for jar
annotationProcessor(configurationProcessor) // for IntelliJ Idea
}
/* ... */
kapt {
annotationProcessor("org.springframework.boot.configurationprocessor.ConfigurationMetadataAnnotationProcessor")
}
/* ... */
tasks {
withType<KotlinCompile> {
dependsOn(processResources)
}
}
Kotlin Kapt is needed to work with metadata and memory.
From official Spring documentation, Spring Boot Configuration Processor generates special json file with properties metadata.
Therefore, to distribute jar
with property syntax highlight you need:
jar
packaging by using dependsOn
(not sure, that my code above is the most effective solution, however problem is solved)However IntelliJ Idea works with annotationProcessor
Gradle configuration (unfortunately, I don't have exact answer, why it requires exact it). Therefore you need add the same processor into the annotationProcessor
configuration as well.
Upvotes: 4
Reputation: 2478
In order for IntelliJ IDEA to know your Spring Boot properties, you can define Spring Boot configuration metadata in your project.
If you can use a @ConfigurationProperties
-annotated class for your properties, you can add the Spring Boot configuration annotation processor to your classpath and IntelliJ IDEA will generate the configuration metadata for you in target
or out
:
Maven:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
Gradle:
implementation 'org.springframework.boot:spring-boot-configuration-processor'
Create the configuration metadata file yourself src/main/resources/META-INF/spring-configuration-metadata.json
:
Content:
{
"properties": [
{
"name": "myapp.someprop",
"type": "java.lang.String"
},
{
"name": "myapp.someintprop",
"type": "java.lang.Integer"
}
]
}
In the IntelliJ IDEA tool window of your build system (Maven/Gradle), click the "Refresh" button.
Select Build > Rebuild Project
from the menu.
If the warning still appears, you can try to restart the IDE. Select File > Invalidate Caches / Restart
and click on Invalidate and Restart
.
Upvotes: 122