web-dev-qa-db-fra.com

Je ne peux pas @Autowire un bean qui est présent dans un bocal de bibliothèque dépendant?

J'ai une application Spring Boot (Y) qui s'appuie sur un ensemble de fichiers de bibliothèque compressés sous x.jar et mentionnés comme une dépendance dans le pom.xml de l'application Y.

x.jar a un bean nommé (User.Java) L'application Y a une classe Java nommée (Department.Java)

Pendant que j'essaie de câbler automatiquement une instance de User.Java dans Department.Java, j'obtiens l'erreur suivante

Je ne peux pas @Autowire un bean qui est présent dans un bocal de bibliothèque dépendant?

Champ de câblage automatique impossible: utilisateur com.User privé; Une exception imbriquée est org.springframework.beans.factory.NoSuchBeanDefinitionException: aucun bean éligible de type [com.User] n'a été trouvé pour la dépendance: attendait au moins 1 bean qui se qualifie comme candidat de câblage automatique pour cette dépendance. Annotations de dépendance: {@ org.springframework.beans.factory.annotation.Autowired (required = true)}

Aucun bean qualifiant de type [com.User] trouvé pour la dépendance: attend au moins 1 bean qui se qualifie comme candidat de câblage automatique pour cette dépendance. Annotations de dépendance: {@ org.springframework.beans.factory.annotation.Autowired (required = true)} **

Voici le code de l'application Spring Boot 'Y'

package myapp;

@Component
public class Department {

    @Autowired
    private com.User user;

    //has getter setters for user

}

Voici le code de User.Java dans la bibliothèque x.jar

 package com;

@Component
@ConfigurationProperties(prefix = "test.userproperties")
public class User {

  private String name;
  //has getter setters for name    
}

Il s'agit de l'entrée de dépendance pour x.jar dans le pom.xml de l'application Y

      <groupId>com.Lib</groupId>
      <artifactId>x</artifactId>
      <version>001</version>
    </dependency>   

Ceci est la classe principale de l'application "Y"

@Configuration
@EnableAutoConfiguration
@ComponentScan
@EnableZuulProxy
@EnableGemfireSession(maxInactiveIntervalInSeconds=60)
@EnableCircuitBreaker
@EnableHystrixDashboard
@EnableDiscoveryClient
public class ZuulApplication {

    public static void main(String[] args) {
        new SpringApplicationBuilder(ZuulApplication.class).web(true).run(args);
    }
}   

Le département et l'utilisateur sont sous des packages différents.

Solution: J'ai appliqué les 2 étapes suivantes et maintenant le câblage automatique fonctionne correctement.

Étape 1: Ajout de la classe suivante dans le fichier jar

package com
@Configuration
@ComponentScan
public class XConfiguration {

}

Étape 2: importé cette classe de configuration dans la classe principale du projet Y

@Configuration
    @EnableAutoConfiguration
    @ComponentScan
    @EnableZuulProxy
    @EnableGemfireSession(maxInactiveIntervalInSeconds=60)
    @EnableCircuitBreaker
    @EnableHystrixDashboard
    @EnableDiscoveryClient
    @Import(XConfiguration.class) 
    public class ZuulApplication {

        public static void main(String[] args) {
            new SpringApplicationBuilder(ZuulApplication.class).web(true).run(args);
        }
    }
15
yathirigan

Vous devez ajouter les noms de package de votre classe principale et de la classe User pour être sûr à 100%, mais plus probablement, la classe User n'est pas dans le même package (ou un sous-package) de votre classe principale. Cela signifie que la numérisation des composants ne les récupérera pas.

Vous pouvez forcer Spring à regarder d'autres packages comme celui-ci:

@ComponentScan(basePackages = {"org.example.main", "package.of.user.class"})
12
Wim Deblauwe