IntelliJ не получает собственные метаданные конфигурации Spring

У меня возникают проблемы с тем, чтобы IntelliJ собирал пользовательские метаданные конфигурации Spring с помощью Gradle.

Если я создаю новый проект Spring Boot с инициализатором, включаю обработчик конфигурации в зависимости, в задаче Gradle устанавливаю следующие задачи:

IntelliJ не получает собственные метаданные конфигурации Spring

создайте класс с содержимым:

package com.example.demo;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties("mycustomconfig")
public class MyCustomConfig {

    private String name;

    public String getName() {
        return name;
    }

    public MyCustomConfig setName(String name) {
        this.name = name;
        return this;
    }
}

затем IntelliJ жалуется в файле класса «Обработчик аннотаций конфигурации Spring Boot не найден в пути к классам», хотя он определенно находится в пути к классам.

После запуска приложения в build/classes/java/main/META-INF/spring-configuration-metadata.json создается файл со следующим содержимым:

{
  "groups": [
    {
      "name": "mycustomconfig",
      "type": "com.example.demo.MyCustomConfig",
      "sourceType": "com.example.demo.MyCustomConfig"
    }
  ],
  "properties": [
    {
      "name": "mycustomconfig.name",
      "type": "java.lang.String",
      "sourceType": "com.example.demo.MyCustomConfig"
    }
  ],
  "hints": []
}

Но затем IntelliJ жалуется в application.properties: Cannot resolve configuration property "mycustomconfig.name".

Тот же эксперимент безупречно работает с Maven. Есть ли что-то, что я делаю неправильно?

Я использую IntelliJ 2018.3 Ultimate.

Мой build.gradle:

plugins {
    id 'org.springframework.boot' version '2.1.3.RELEASE'
    id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
2
0
5 409
3

Ответы 3

Не уверен, что вы решили эту проблему, но я только что обновился до 2018.3 Ultimate и столкнулся с той же проблемой. Я подозреваю, что это проблема IntelliJ, но, тем не менее, я решил ее, добавив следующую строку

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

Чуть выше строки "annotationProcessor" в моем файле gradle...

надеюсь, это поможет

Наконец-то я нашел причину проблемы.

Процессор аннотаций выводит spring-configuration-metadata.json в build/classes/java/main/META-INF`.

Но: IntelliJ использует другой путь к классам для разрешения. Перейдя в Структуру проекта/Модули/основной модуль/Пути, вы можете увидеть, что для вывода компилятора установлено значение «использовать выходной путь компиляции модуля» и указывает на out/production/classes. Это разрешается из Gradle автоматически; его изменение будет отменено, как только вы внесете какие-либо изменения в Gradle.

Я обнаружил, что есть две возможности:

Настройте обработчик аннотаций Spring Boot вручную в IntelliJ Preferences/Build, Execution, Deployment/Compiler/Annotation Processors со следующими параметрами:

Annotation Processor configuration

Преимущество этого в том, что вам не нужно запускать полную сборку gradle - работает только компиляция из IntelliJ. К сожалению, кажется, что каждый пользователь в проекте настраивает это вручную.

Вторая возможность упоминается в в этом вопросе о переполнении стека. Установите эти параметры idea в Gradle:

idea{
    module{
        inheritOutputDirs = false
        outputDir = compileJava.destinationDir
        testOutputDir = compileTestJava.destinationDir
    }
}

В основном теперь используется один скомпилированный целевой класс как для IntelliJ, так и для Gradle. Однако, похоже, есть некоторые предостережения, как указано в связанных URL-адресах.

Если вы используете Maven, добавление этой зависимости решит проблему.

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

Другие вопросы по теме