2017-08-04 4 views
1

Ich habe kürzlich ein Projekt von Spring 4.3.1 auf 4.3.4 aktualisiert und was früher gut funktionierte, wird jetzt einfach nicht für mich funktionieren.Spring @Inject funktioniert nicht

Ich benutze JPA, die eine Reihe von Repository-Klassen gilt:

/** 
* Spring Data JPA repository for the DrugQualityCategory entity. 
*/ 

public interface DrugQualityCategoryRepository extends JpaRepository<DrugQualityCategory,Long> { 

    @Query(value = "Select a from DrugQualityCategory a where a.oldId = ?1") 
    DrugQualityCategory findOneByOldId(Integer oldId); 

} 

Wir auch Elasticsearch für die Suchmaschine verwenden, die eine Reihe von SearchRepositories wie folgt erstellt:

/** 
* Spring Data ElasticSearch repository for the Publication entity. 
*/ 
public interface DrugQualityCategorySearchRepository extends ElasticsearchRepository<Publication, Long> { 
} 

Einer Das Problem mit ES besteht darin, dass es seine Indizes regelmäßig aktualisieren muss. Daher haben wir einen Test erstellt, bei dem alle Repositories injiziert und aus dem JPA-Repository neu erstellt werden, wie bei der Injektion der Repos:

@RunWith(SpringJUnit4ClassRunner.class) 
    @WebAppConfiguration 
    @Transactional 
    @ActiveProfiles("syncElasticsearch") 
    public class SyncMysqlElasticSearch { 

    private Logger logger = LoggerFactory.getLogger(getClass()); 

    @Inject DrugQualityCategoryRepository drugQualityCategoryRepository; 
    @Inject TechniqueRepository techniqueRepository; 
    @Inject TradeDrugRepository tradeDrugRepository; 
    @Inject SurveyDataRepository surveyDataRepository; 
    @Inject RQAAQualityRepository rqaaQualityRepository; 

Und dann füllen wir die Instanzen ES:

drugQualityCategorySearchRepository.save(drugQualityCategoryRepository.findAll()); 
formulationSearchRepository.save(formulationRepository.findAll()); 
innDrugSearchRepository.save(innDrugRepository.findAll()); 
locationSearchRepository.save(locationRepository.findAll()); 
manufacturerSearchRepository.save(manufacturerRepository.findAll()); 

Nun ist die Frage, die ich habe ist, dass wenn ich versuche, den Test zu starten, erhalte ich die:

org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name [class name] Unsatisfied dependency expressed 
through field [field name] nested exception is 
org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type [class name] available: expected at least 
1 bean which qualifies as autowire candidate. Dependency annotations: {@javax.inject.Inject()} 

I habe hier einige Fragen wie this und this überprüft, hatte einen schnellen Blick auf die Spring-Dokumente, konnte aber nichts Relevantes finden

Ich habe natürlich versucht, all @Autowired, @Component und @Repository-Tags in verschiedenen Orten, zu keinem positiven Ergebnis

+0

Wie stellen Sie Ihren Kontext zum Testen ein? – Jan

+0

Hallo Jan, ich bin mir nicht sicher, ich weiß, was Sie hier mit Kontext meinen, ich habe eine Config-XML-Datei, die die Verbindungsparameter für ES und JPA setzt, abgesehen davon, ich habe nur die Anmerkungen, die in den Code-Extrakten sind in der ursprünglichen Frage – Steven

Antwort

1

Sie benötigen eine Testklasse mit einer @ContextConfiguration Anmerkung mit Anmerkungen versehen, die auf die jeweilige @Configuration Klasse zeigt, die durchsucht und Register all diese Bohnen, die du versuchst zu spritzen.

Siehe die Java-Dokumentation für @WebAppConfiguration:

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/web/WebAppConfiguration.html

Beachten Sie, dass @WebAppConfiguration muss mit @ContextConfiguration, entweder innerhalb einer einzelnen Testklasse oder in einem Testklassenhierarchie in Verbindung verwendet werden.

+0

Hallo, danke für deine Antwort, ich habe das mit der letzten Stunde versucht, kann es immer noch nicht zur Arbeit bringen. Ich habe versucht, nur die Annotation für den Kontext hinzufügen, es wird nicht meine Hauptklasse als Parameter, es sagt, es existiert nicht, es wird nicht ein Klassenpfad *: als Parameter entweder. Ich habe versucht, das Konfigurations-Tag der Hauptklasse hinzuzufügen, kein Glück damit, machte auch die meisten Kombinationen mit Repository-Tags, etc ... Fehle ich etwas? – Steven

+1

@Steven Sie verwenden XML oder Java Conig oder Spring Boot? – Plog

+0

Java-Konfiguration mit Spring-Boot, ich denke, ich könnte auf etwas, ich habe nur mit ContextConfiguration (classes = DrugQualityDataManagerApp.class) kommentiert und jetzt gibt es mir, was ich glaube, dass ein nicht damit zusammenhängender Fehler – Steven