2016-12-23 5 views
0

J'ai un projet Spring Boot existant (1.4.3.RELEASE) et j'essaie d'ajouter quelques fonctionnalités en utilisant le projet Cloud AWS. Toutefois, l'ajout de la dépendance au fichier de construction gradle provoque un problème apparent de cglib lors de l'instanciation de l'une de mes classes @Configuration.Spring Cloud AWS cglib issue

ajoutant la ligne suivante à Gradle construction et l'exécution de l'application:

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

Causes:

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] 

Il se plaint de ne pas trouver un constructeur non vide dans ma classe @Configuration, mais les sont pris en charge dans la dernière version de Spring. L'application démarre bien si je supprime la dépendance. Comment résoudre ce problème sans reconfigurer mes cours? Vous attendez une version mise à jour de Cloud AWS?

+0

Cette version de la messagerie AWS est basée sur Spring Boot 1.3, qui utilise Spring 4.2 qui ne prend pas en charge les constructeurs non vides. Vous pourriez essayer de forcer la dépendance du ressort à 4.3 mais le fait qu'il utilise Spring Boot 1.3 le rend probablement inutilisable pour 1.4 (modifications de l'API interne pour Boot). –

+0

Merci pour la réponse. J'ai reconfiguré la classe pour avoir un constructeur vide et autowire les dépendances dedans mais maintenant même le comportement autowiring ne fonctionne pas correctement. Je ne sais pas pourquoi l'ajout de ceci causerait un tel désordre dans le comportement de base du printemps, mais bon. Je vais voir si je peux trouver une solution de contournement. – koreys

+0

Aussi juste pour mettre à jour ... J'ai rétrogradé la version Spring Boot à 1.3.8 et j'ai toujours le même problème où la classe de configuration n'obtient pas ses champs autowired. Enlevez cette dépendance et tout fonctionne comme il se doit. – koreys

Répondre

1

Vous devez configurer votre application pour utiliser les dépendances de nomenclature afin d'éviter les conflits de dépendance. Les nomenclatures ressemblent plus à une fonctionnalité maven (vous pouvez lire here) mais les gens de Spring ont mis au point un plugin Gradle pour permettre le même comportement. Regardez dans cette Spring Blog Post pour une explication complète. Mais fondamentalement ajouter ceci à votre config gradle:

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

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

Vous pouvez alors faire:

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

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

sur lequel vous ne devez pas spécifier la version de dépendance réelle pour les plug-ins de démarrage du printemps.

+1

Cela n'a pas fonctionné pour moi. – koreys