Intellij IDEA скаржиться, що не може вирішити властивості весняного завантаження, але вони працюють нормально


80

введіть тут опис зображення

Не вдається вирішити властивість конфігурації '...

У мене немає проблем з доступом до моїх властивостей через анотацію @Value або через автоматично підключене середовище. Але всі мої власні властивості отримують це попередження в IDEA. Що я повинен робити, щоб IDEA розпізнав їх і не турбував?


1
Не турбуйтеся про це; IntelliJ і так трохи розпізнає власні властивості. У кращому випадку ви можете подати помилку в JetBrains.
Макото

1
Ви можете перевірити, які аспекти пов’язані з вашим проектом. Спробуйте ctrl + alt + shift + s та знайдіть грані. Можливо, вам доведеться вручну додати пружинний (завантажувальний) фасет, щоб Intellij зрозумів ..
Тобб

Я додав пружинний фасет, і змін не було. Але у мене в списку немає аспекту Spring (завантаження). Можливо, тому, що я перебуваю у версії IDEA 2016 року.
Stoopkid

Чи можна навести зразок прикладу проекту для розслідування?
y.bedrov

спробуйте встановити плагін Spring Assistant.
Keaz

Відповіді:


90

Щоб IntelliJ IDEA знав ваші властивості Spring Boot, ви можете визначити метадані конфігурації Spring Boot у своєму проекті.

Варіант 1:

Якщо ви можете використовувати @ConfigurationProperties-анотований клас для своїх властивостей, ви можете додати процесор анотації конфігурації Spring Boot до шляху до вашого класу, і IntelliJ IDEA згенерує для вас метадані конфігурації в targetабо out:

Мейвен:

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

Градле:

implementation 'org.springframework.boot:spring-boot-configuration-processor'

Варіант 2:

Створіть файл метаданих конфігурації самостійно src/main/resources/META-INF/spring-configuration-metadata.json:

Зміст:

{
  "properties": [
    {
      "name": "myapp.someprop",
      "type": "java.lang.String"
    },
    {
      "name": "myapp.someintprop",
      "type": "java.lang.Integer"
    }
  ]
}

Варіанти 1 і 2:

У вікні інструменту IntelliJ IDEA вашої системи складання (Maven / Gradle) натисніть кнопку "Оновити".

Виберіть Build > Rebuild Projectз меню.

Якщо попередження все ще відображається, ви можете спробувати перезапустити IDE. Виберіть File > Invalidate Caches / Restartі натисніть на Invalidate and Restart.


3
Це саме те, що мені потрібно було! Я пішов із варіантом 2!
MaxPower

2
FYI. Spring Reference> Додаток B. Метадані конфігурації: docs.spring.io/spring-boot/docs/current/reference/html/…
Намо

2
Виберіть «Будувати»> «Відновити проект» у меню, щоб виправити мою проблему
Youness Marhrani

Я писав властивості в applicaition.property і використовував в залежності (інша jar). Чи може це спрацювати?
fjjiaboming

3
Я настійно рекомендую використовувати варіант 1 ( @ConfigurationPropertiesі процесор анотацій), оскільки це заощаджує вам нудний та схильний до помилок рукописний ввод файлів метаданих. І після початкового налаштування це навіть простіше у використанні, ніж @Valueанотації.
Deamon

1

У мене була та сама проблема, а також не показ автоматичного заповнення. З’ясувалося, що він працює з версією IntelliJ Ultimate, а не з версією спільноти. посилання

Пара корисних кроків:

  • додавання залежності Maven :
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
  • оновіть Maven для завантаження залежностей.
  • впоратися з точною назвою властивості, target/classes/META-INF/spring-configuration-metadata.jsщоб запобігти помилкам.
  • переконавшись, що ваш конфігураційний клас анотований @ConfigurationProperties("name-here")та що ви його включили до@EnableConfigurationProperties(NameOfTheConfigClass.class)

1
Це найповніша відповідь для мене. Великі пальці вгору людина !!
mikaelovi

0

Будь ласка, використовуйте наступне для сценарію Gradle Kotlin для проекту Kotlin:

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 потрібен для роботи з метаданими та пам'яттю.

З офіційної весняної документації Spring Boot Configuration Processor генерує спеціальний json-файл із метаданими властивостей.

Отже, для розповсюдження jarз виділенням синтаксису властивостей вам потрібно:

  • Попросіть Gradle створити цей файл
  • Оновіть послідовність завдань для створення файлу перед jarупаковкою за допомогою dependsOn(не впевнений, що мій код вище є найбільш ефективним рішенням, однак проблема вирішена)

Однак IntelliJ Idea працює з annotationProcessorконфігурацією Gradle (на жаль, я не маю точної відповіді, чому вона вимагає саме її). Тому вам потрібно також додати той самий процесор у annotationProcessorконфігурацію.


0

Рішення, засноване на Gradle, полягає в наступному:

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)
    }
}

Після запуску збірки (або просто processResourcesзавдання) з панелі Intellij Gradle попередження про властивості повинні зникнути.

Не ідеально, але IntelliJ, що не підтримує kapt, теж не ідеально: - /


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.