web-dev-qa-db-fra.com

Spring Boot: les fils automatiques du projet de bibliothèque

J'ai du mal à câbler automatiquement les beans de ma bibliothèque personnalisée, importés avec gradle. après avoir lu quelques sujets similaires, je n'arrive toujours pas à trouver de solution.

J'ai un projet Spring Boot qui dépend d'un autre projet (ma bibliothèque personnalisée avec composants, référentiels etc ...). Cette bibliothèque est un fichier jar non exécutable Spring, composé principalement d'entités et de référentiels de domaine. Il n'a pas Application.class exécutable et aucune propriété ...

Lorsque je démarre l'application, je peux voir que mon bean 'CustomUserService' (de la bibliothèque) essaie d'être initialisé, mais le bean câblé automatiquement n'a pas pu se charger (interface UserRepository) ...

Erreur:

Le paramètre 0 du constructeur dans com.myProject.customLibrary.configuration.CustomUserDetailsService nécessitait un bean de type 'com.myProject.customLibrary.configuration.UserRepository' introuvable.

J'ai même essayé de définir 'Order', de le charger explicitement (avec 'scanBasePackageClasses'), de scanner avec des packages et des classes de marqueurs, d'ajouter une annotation supplémentaire 'EnableJPARepository' mais rien ne fonctionne ...

Exemple de code (les noms des packages ont été modifiés pour plus de simplicité)

package runnableProject.application;

import runnableProject.application.configuration.ServerConfigurationReference.class
import com.myProject.customLibrary.SharedReference.class

//@SpringBootApplication(scanBasePackages = {"com.myProject.customLibrary", "runnableProject.configuration"}) 
//@EnableJpaRepositories("com.myProject.customLibrary")  

@SpringBootApplication(scanBasePackageClasses = {SharedReference.class, ServerConfigurationReference.class})   
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

}

Cours de bibliothèque:

package com.myProject.customLibrary.configuration;

import com.myProject.customLibrary.configuration.UserRepository.class;

@Service
public class CustomUserDetailsService implements UserDetailsService {
    private UserRepository userRepository;    

    @Autowired
    public CustomUserDetailsService(UserRepository userRepository) {
        this.userRepository = userRepository;       
    }
...

package myProject.customLibrary.configuration;

@Repository
public interface UserRepository extends CustomRepository<User> {
    User findByLoginAndStatus(String var1, Status var2);

    ...
}
17
maret

Je viens de trouver la solution. Au lieu de définir des packages de base à analyser à partir d'une bibliothèque distincte, je viens de créer une classe de configuration à l'intérieur de cette bibliothèque avec un tas d'annotations et de l'importer dans ma principale MyApplication.class:

package runnableProject.application;    

import com.myProject.customLibrary.configuration.SharedConfigurationReference.class

@SpringBootApplication
@Import(SharedConfigurationReference.class)
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

}
package com.myProject.customLibrary.configuration;

@Configuration
@ComponentScan("com.myProject.customLibrary.configuration")
@EnableJpaRepositories("com.myProject.customLibrary.configuration.repository")
@EntityScan("com.myProject.customLibrary.configuration.domain")
public class SharedConfigurationReference {}
46
maret