web-dev-qa-db-fra.com

Comment puis-je @Autowire un haricot printanier créé à partir d'un bocal externe?

J'ai un module/jar que j'ai créé et que j'utilise comme util bibliothèque . J'ai créé un service là-bas comme suit:

@Service
public class PermissionsService { ... }

... où cela réside dans un paquet ici: com.inin.architect.permissions et dans mon application principale, je référence/charge ce fichier (c'est-à-dire, défini comme dépendance dans le fichier maven POM.xml pour l'application) comme si:

<dependency>
        <groupId>com.inin.architect</groupId>
        <artifactId>permissions</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

et dans l'application, je veux utiliser ce service comme:

@Autowired
PermissionsService permissions

Dans l'installation de printemps de l'application, j'ai ceci:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.inin.generator", "com.inin.architect.permissions" })
public class WebConfig extends WebMvcConfigurerAdapter implements ServletContextAware { }

Cependant, lorsque j'exécute mon application sous Tomcat, il se plaint de l'absence d'un bean pour le PermissionsService : "org.springframework.beans.factory.NoSuchBeanDefinitionException: aucun bean qualifiant de type ..."

Alors, comment puis-je importer le haricot de la bibliothèque dans mon application? Il y a sûrement un moyen. Devez-vous configurer la bibliothèque en tant qu’application MVC à ressort développé pour que cela puisse fonctionner? c’est-à-dire que vous devez également avoir les configurations @Configuration et @ComponentScan dans la bibliothèque

27
BrianP

Vous devez au moins analyser le paquet contenant la classe que vous voulez injecter. Par exemple, avec l'annotation Spring 4:

@Configuration
@ComponentScan("com.package.where.my.class.is")
class Config {
...
}

C'est le même principe pour la configuration XML.

46
Benjamin Boutier

Juste une note à ce sujet, mais vous pourriez découpler votre dépendance du printemps. Dans votre classe @Configuration, créez 

@Bean public PermissionsService  permissionsService(){
   return new PermissionsService()
}

Cela permettra également de l'injecter. Non pas que vous deviez supprimer votre annotation de ressort, mais simplement une option le rendant potentiellement utilisable en dehors du printemps.

17
Maleck13

Ok - j’ai eu exactement le même problème - je voulais autoriser une interface de dépôt mongo db depuis un jar externe.

  • Je pourrais autowire chaque haricot de ce pot avec l'aide

    @SpringBootApplication (scanBasePackages = {"com.myrootpackage"})

  • Cependant - l'auto-câblage de l'interface échouait toujours avec "Impossible de trouver blablabla ..."

Mais l'interface était dans le même package que les beans que je pouvais importer . Il s'est avéré que la recherche des interfaces mongo db ne prend PAS en compte les scanBasePackages de @SpringBootApplication!

Il doit être explicitement configuré via

@EnableMongoRepositories(basePackages = {"com.myrootpackage"})

Vous pouvez également déplacer la classe principale "vers le haut" afin que la recherche par défaut fonctionne également pour les interfaces mongo. J'ai donc compris le problème et trouvé une solution. Mais je suis toujours un peu mécontent parce que je dois configurer le même chemin de recherche deux fois. Je trouve ça stupide honnêtement.

1
Holgi P

Vous pouvez importer application-context.xml pour com.inin.architect.permissions de la manière suivante dans votre application principale.

<import resource="classpath:/permissionApplicationContext.xml" />

Cela vous permettra d'autowire les beans de com.inin.architect.permissions que vous avez définis.

1
s91g