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