Проблема с Spring Cloud AWS cglib

У меня есть существующий проект Spring Boot (1.4.3.RELEASE), и я пытаюсь добавить некоторые функции с помощью проекта Cloud AWS. Однако простое добавление зависимости к файлу сборки gradle вызывает очевидную проблему cglib при создании экземпляра одного из моих классов @Configuration.

Добавление следующей строки в сборку gradle и запуск приложения:

compile("org.springframework.cloud:spring-cloud-starter-aws-messaging:1.1.3.RELEASE")

Причины:

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.***.application.config.AwsConfig$$EnhancerBySpringCGLIB$$5301ed81]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.***.application.config.AwsConfig$$EnhancerBySpringCGLIB$$5301ed81.()
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:85) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]

Он жалуется на то, что не нашел непустой конструктор в моем классе @Configuration, но они поддерживаются в последней версии Spring. Приложение загружается нормально, если я удалю зависимость. Как исправить это, не перенастраивая мои классы? Ждать обновленную версию Cloud AWS?


person koreys    schedule 23.12.2016    source источник
comment
Эта версия обмена сообщениями AWS основана на Spring Boot 1.3, в которой используется Spring 4.2, которая не поддерживает непустые конструкторы. Вы можете попробовать принудительно установить зависимость Spring до 4.3, но тот факт, что он использует Spring Boot 1.3, вероятно, делает его неработающим для 1.4 (внутренние изменения API и т. Д. Для загрузки).   -  person M. Deinum    schedule 24.12.2016
comment
Спасибо за ответ. Я перенастроил класс так, чтобы он имел пустой конструктор и автоматически подключал зависимости, но теперь даже поведение автоматического подключения работает некорректно. Не уверен, почему добавление этого вызовет такой беспорядок в поведении ядра Spring, ну да ладно. Я посмотрю, смогу ли я найти обходной путь.   -  person koreys    schedule 29.12.2016
comment
Также просто для обновления ... Я понизил версию Spring Boot до 1.3.8, и у меня все еще есть та же проблема, когда класс конфигурации не получает свои поля автоматически. Удалите эту зависимость, и все заработает как надо.   -  person koreys    schedule 30.12.2016
comment
Ну, конечно, у вас все еще будет та же проблема, с которой изначально была проблема. Во всяком случае, вы должны установить его на 1.4, но это, вероятно, приведет к тому, что другие вещи не будут работать.   -  person M. Deinum    schedule 30.12.2016


Ответы (1)


Вам необходимо настроить приложение для использования зависимостей спецификации, чтобы избежать конфликтов зависимостей. Спецификации больше похожи на функцию maven (вы можете прочитать здесь), но люди из Spring придумали плагин Gradle, позволяющий такое же поведение. Прочтите Spring Blog Post, чтобы полное объяснение. Но в основном добавляем это в конфигурацию Gradle:

buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath "io.spring.gradle:dependency-management-plugin:1.0.0.RC1"
  }
}

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

Затем вы можете:

dependencyManagement {
  imports {
    mavenBom 'org.springframework.boot:spring-boot-starter-parent:1.4.2.RELEASE'
  }
}

dependencies {
  compile "org.springframework.boot:spring-boot-starter-web"
}

На котором вам не нужно указывать фактическую версию зависимости для плагинов загрузки Spring.

person Ulises    schedule 23.12.2016