SpringBoot: ne Peut pas Autowire Classe à partir d'Autres Jar Bibliothèque
Je suis en train d'élaborer un SpringBoot application (par exemple MyApp) avec dépendance de deux projets de données avec des différents la mise en œuvre:
data-jdbc.jar
- construit à l'aide de la
spring-boot-starter-jdbc
qui expose JDBCDataService classe qui sera utilisée par mon application
Exemple De Code:
@Service
public class JDBCDataServiceImpl implements JDBCDataService {
@Autowired
private JDBCDataRepository jdbcDataRepository;
...
}
- avec le paquet
my.data.jdbc
- il n'y a pas de SpringBoot classe principale. Printemps de configuration créés uniquement pour l'unité des classes de test
- les classes de dépôt sont à l'aide de
JDBCTemplate
Référentiel Exemple:
@Repository
public class JDBCDataRepositoryImpl implements JDBCDataRepository {
@Autowired
protected JdbcTemplate jdbcTemplate;
...
}
data-jpa.jar
- construit à l'aide de la
spring-boot-starter-data-jpa
qui expose également JPADataService classe qui sera également utilisé par mon application
Exemple De Code:
@Service
public class JPADataServiceImpl implements JPADataService {
@Autowired
private JPADataRepository jpaDataRepository;
...
}
- avec le paquet
my.data.jpa
- il n'y a pas de SpringBoot classe principale. Printemps de configuration créés uniquement pour l'unité des classes de test
- classes de dépôt s'étend le
CrudRepository
interface
Référentiel Exemple:
@Repository
public interface JPADataRepository extends CrudRepository<MyObject, Integer{
...
}
Dans mon SpringBoot projet, j'ai le texte suivant SpringBoot principale de l'application:
@SpringBootApplication
public class MyApp extends SpringBootServletInitializer {
}
Dans mon entreprise de service MainService
classe, j'ai la suite de l'injection
@Service
public class MainServiceImpl implements MainService {
@Autowired
private JDBCDataService jdbcDataService;
@Autowired
private JPADataService jpaDataService;
Cependant, j'ai rencontré le problème "Could not Autowire. No beans of 'JPADataService' type found"
qui n'existe que pour la classe JPADataService
mais fonctionne très bien pour JDBCService
classe.
J'ai essayé la solution trouvée dans les questions suivantes, mais aucun de ces travaux dans mon cas:
Je ne peux pas @Autowire un Haricot qui est présent dans une Bibliothèque dépendante Pot?
@ComponentScan(basePackages = {"org.example.main", "package.of.user.class"})
Comment puis-je @Autowire un printemps bean qui a été créé à partir d'un externe pot?
@Configuration
@ComponentScan("com.package.where.my.class.is")
class Config {
...
}
J'ai maintenant trouvé la solution à mon problème. Je dois déplacer mon principal MyApp.java un package de niveau supérieur pour l'analyse de mes données des bibliothèques.
Au lieu de mettre mon MyApp.java
sous my.app
paquet, j'ai pour le déplacer vers my
afin de lire mes bibliothèques avec my.data.jpa
et my.data.jdbc
paquets.
@ComponentScan
ne fonctionnera que si la JPADataService
classe est annotée avec @Component
. Vous avez besoin d'ajouter un @Bean
méthode annotée dans votre @Configuration
classe. docs.printemps.io/printemps-javaconfig/docs/1.0.0.m3/référence/html/...Schneider ,les deux classes de service dans les deux fichiers jar sont en fait annoté avec
@Service
. Autant que je sache, @ComponentScan
devrait également être en mesure de lire ces classes.doit prendre soin d'elle. Vous dites que vous n'avez pas de classe principale, donc où est le point d'entrée de la demande?
Le point d'entrée est dans mon nouveau SpringBoot application (MyApp) que je suis en train d'élaborer, de sorte que j'ai ces données comme ma dépendance à mon projet maven.
OriginalL'auteur Jown | 2016-08-05
Vous devez vous connecter pour publier un commentaire.
J'ai maintenant trouvé la solution à mon problème. Je dois déplacer mon principal MyApp.java un package de niveau supérieur pour l'analyse de mes données des bibliothèques.
Au lieu de mettre mon
MyApp.java
sousmy.app
paquet, j'ai pour le déplacer versmy
afin de lire mes bibliothèques avecmy.data.jpa
etmy.data.jdbc
paquets.Pourquoi est-ce arrivé? C'est un bug ou un printemps-fonction de démarrage?
Ce n'est pas un bug, @ComponentScan par défaut ramasse de l'emballage où la classe principale est définie et des sous-répertoires
OriginalL'auteur Jown
Ajoutant @ComponentScan ne fonctionnera pas si la classe que vous tentez d'Autowire n'est pas annotée avec @Composant. Afin d'obtenir que cela fonctionne, vous aurez pour annoter une méthode dans votre
@Configuration
classe. Quelque chose comme cela devrait vous permettre de autowire la classe:Si c'est le cas, il devrait également ne pas fonctionner dans
JDBCService
objet que je n'ai pas déclaré cette classe en Java fichier de configuration dans mon application qui les utilise. Autant que je sache, à l'aide de@SpringBootApplication
devrait faire de la magie pour vous 🙂quelqu'un sait pourquoi "@ComponentScan' habitude de travailler? Je suis confronté au même problème, mon référentiel est même annoté par "@Repository " et a ajouté une ComponentScan avec la valeur du forfait de base, qui est d'un niveau où le printemps pouvait voir tous les haricots, même à partir de pot de bibliothèques. L'application ne fonctionnait que quand j'ai déménagé au niveau de la SpringBootApplication @Jown dit.
OriginalL'auteur Christopher Schneider
Vous avez besoin de config
spring.factories
externe jar:le contect de printemps.factoires, comme ceci:
OriginalL'auteur Bond Zhou