Ich entwickle eine SpringBoot Anwendung (zB MeineAnw) mit Abhängigkeit zu zwei Datenprojekten mit unterschiedlicher Umsetzung:SpringBoot: Kann nicht Autowire Klasse aus anderer Jar-Bibliothek
Daten jdbc.jar
- baute die
spring-boot-starter-jdbc
verwendet, die JDBCDataService Klasse stellt die
Beispielcode von meiner Anwendung verwendet werden :
@Service
public class JDBCDataServiceImpl implements JDBCDataService {
@Autowired
private JDBCDataRepository jdbcDataRepository;
...
}
- mit Paket
my.data.jdbc
- gibt es keine SpringBoot Hauptklasse. Spring-Konfiguration nur für die Einheit Testklassen erstellt
- die Repository-Klassen verwenden
JDBCTemplate
Beispiel Repository:
@Repository
public class JDBCDataRepositoryImpl implements JDBCDataRepository {
@Autowired
protected JdbcTemplate jdbcTemplate;
...
}
Daten jpa.jar
- gebaut mit der
spring-boot-starter-data-jpa
die auch expos es JPADataService Klasse, die auch von meiner Anwendung verwendet wird
Beispielcode:
@Service
public class JPADataServiceImpl implements JPADataService {
@Autowired
private JPADataRepository jpaDataRepository;
...
}
- mit Paket
my.data.jpa
- gibt es keine SpringBoot Hauptklasse. Spring-Konfiguration nur für die Einheit Testklassen
- Repository-Klassen erstellt erweitert die
CrudRepository
Schnittstelle
Beispiel Repository:
@Repository
public interface JPADataRepository extends CrudRepository<MyObject, Integer{
...
}
In meinem SpringBoot Projekt, ich habe folgende SpringBoot Hauptanwendung:
@SpringBootApplication
public class MyApp extends SpringBootServletInitializer {
}
In meinem Business-Service MainService
Klasse habe ich die folgende Injektion
@Service
public class MainServiceImpl implements MainService {
@Autowired
private JDBCDataService jdbcDataService;
@Autowired
private JPADataService jpaDataService;
Allerdings habe ich das Problem "Could not Autowire. No beans of 'JPADataService' type found"
begegnet, die nur für die Klasse existiert JPADataService
aber die Arbeit für JDBCService
Klasse in Ordnung.
ich die Lösung in den folgenden Fragen gefunden haben versucht, aber keiner von ihnen arbeiten in meinem Fall:
Can't I @Autowire a Bean which is present in a dependent Library Jar?
@ComponentScan(basePackages = {"org.example.main", "package.of.user.class"})
How can I @Autowire a spring bean that was created from an external jar?
@Configuration
@ComponentScan("com.package.where.my.class.is")
class Config {
...
}
ich jetzt die Lösung gefunden haben zu meinem Problem. Ich muss mein Hauptpaket MyApp.java ein Paket höher bewegen, um meine Datenbibliotheken zu scannen.
Statt meine MyApp.java
unter my.app
Paket setzen, muss ich es unter my
bewegen, um erfolgreich meine Bibliotheken mit my.data.jpa
und my.data.jdbc
Pakete zu scannen.
'@ ComponentScan' funktioniert nur, wenn die' JPADataService' Klasse mit '@ Component' versehen ist. Sie müssen in Ihrer Klasse '@ Configuration' eine annotierte Methode' @ Bean' hinzufügen. http://docs.spring.io/spring-javaconf/docs/1.0.0.m3/reference/html/creating-bean-definitions.html –
@Christopher Schneider, beide Service-Klassen in beiden JAR-Dateien sind eigentlich mit 'annotiert @ Service'. AFAIK, '@ ComponentScan' sollte auch in der Lage sein, diese Klassen zu lesen. – Jown
@Service sollte darauf achten. Sie sagen, Sie haben keine Hauptklasse, also wo ist der Einstiegspunkt für die Anwendung? –