2017-04-24 12 views
1

Ich erstelle eine Anwendung mit Spring Boot, und ich möchte Dokumente zu Solr abfragen und hinzufügen. So verwende ich Frühling Daten solr dafür, die Maven-Abhängigkeit ist:Wie SolrOperations Bean injizieren, wenn benutzerdefinierte Spring Data Solr-Repository implementieren?

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-data-solr</artifactId> 
</dependency> 

Dann erstelle ich eine Konfigurationsklasse für Solr Repository-Konfiguration. Dank Spring ist alles einfach und funktioniert gut.

@Configuration 
@EnableSolrRepositories(basePackages = { "xxx.xx.xx.resource.repository.solr" },multicoreSupport = true) 
public class SolrConfiguration { 

    @Bean 
    public SolrClient solrClient(@Value("${solr.host}") String solrHost) { 
     return new HttpSolrClient(solrHost); 
    } 

} 

Dann möchte ich für das Speichern von Dokumenten eine benutzerdefinierte Funktion hinzuzufügen, da der Standard-Konverter kann nicht mein verschachtelt Java-Objekt konvertieren. Ich beabsichtige, die Bean SolrClient Bean oder SolrTemplate zum Speichern zu verwenden.

public class HouseSolrRepositoryImpl extends SimpleSolrRepository<House, String> implements HouseSolrRepository{ 

@Autowired 
private SolrClient solrClient; 

    @Override 
    public House save(House house) throw Exception{ 
     // Do converting 
     solrClient.save(doc); 
     solrClient.commit(); 
     return house;/ 
    } 
} 

Aber der Weg von autowired SolrClient wird nicht solrCoreName auf dem Weg aus dem Dokument-Objekt (@Document(solrCoreName = "gettingstarted")). Es fordert nur http://localhost:8983/solr, aber nicht http://localhost:8983/solr/gettingstarted mit dem Kernnamen.

Ich denke, die solrCoreName wird während der Initialisierung von Repository-Beans gesetzt, so dass meine Konfiguration es nicht enthält.

Auf der anderen Seite, fand ich SolrOperation Bean von SimpleSolrRepository wird auch Null, und alle anderen Abfragen wie findOne() kann nicht richtig funktionieren.

Antwort

0

Es scheint, dass ich ein Konzept von Spring Data missverstanden habe, dass wir es nicht mit nativen SolrOperationen verwenden sollten.

Wir können den SolrClient von SolrJ zusammen mit Spring Data verwenden. Hier ist meine einfache Lösung.

Da ich mehrere Kerne in Solr habe, erstelle ich SolrClient (Ersatz von SolrServer in älterer Version) für jeden Kern in configuraiton.

@Bean 
public SolrClient gettingStartedSolrClient(@Value("${solr.host}") String solrHost){ 
    return new ConcurrentUpdateSolrClient(solrHost+"/gettingstarted"); 
} 

@Bean 
public SolrClient anotherSolrClient(@Value("${solr.host}") String solrHost){ 
    return new ConcurrentUpdateSolrClient(solrHost+"/anotherCore"); 
} 

Dann können wir es in unserer Solr dao-Klasse verwenden, durch die autowire SolrClient Bohne.

+0

Funktioniert es für Sie? In meinem Fall erstelle ich immer neue Instanzen, wenn ich die Methode anrufe. – Maralc

Verwandte Themen