2016-08-05 44 views
7

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.

+0

'@ 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 –

+0

@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

+0

@Service sollte darauf achten. Sie sagen, Sie haben keine Hauptklasse, also wo ist der Einstiegspunkt für die Anwendung? –

Antwort

1

Ich habe jetzt die Lösung zu meinem Problem gefunden. 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.

+0

das als mein Problem auch! Vielen Dank! – walv

+0

Warum ist das passiert? Es ist ein Bug oder eine Spring-Boot-Funktion? – ajaristi

3

Das Hinzufügen von @ComponentScan funktioniert nicht, wenn die Klasse, die Sie versuchen, zu Autowire zu machen, nicht mit @Component versehen ist. Um dies zum Laufen zu bringen, müssen Sie eine Methode in Ihrer Klasse annotieren. So etwas sollte dir erlauben, die Klasse automatisch zu routen:

@Configuration 
public class ConfigClass{ 

    @Bean 
    public JPADataService jpaDataService(){ 
     return new JPADataService(); 
    } 
} 
+0

Ich sollte hinzufügen, ich bin nicht vertraut mit JPADataService. Es kann eine Konfiguration erfordern, die ich nicht berücksichtigt habe. –

+0

Wenn dies der Fall ist, sollte es auch nicht im 'JDBCService'-Objekt funktionieren, da ich diese Klasse in keiner Java-Konfigurationsdatei in meiner Anwendung deklariert habe, die sie verwendet. AFAIK, mit '@ SpringBootApplication' sollte die Magie für Sie tun :-) – Jown

+0

jemand weiß, warum '@ComponentScan' wird nicht funktionieren? Ich stehe vor dem gleichen Problem, mein Repository ist sogar mit '@Repository' versehen und hat einen ComponentScan mit Basispaketwert hinzugefügt, der eine Ebene höher ist, in der Spring alle Beans sogar aus Jar-Bibliotheken sehen kann. Die Anwendung funktionierte nur, wenn ich SpringBootApplication um eine Ebene nach oben bewegte, wie @Jown sagte. – SHAKU