Как внедрить bean-компонент SolrOperations при реализации пользовательского репозитория solr данных Spring?

Я создаю приложение с помощью загрузки Spring и хочу запрашивать и добавлять документы в Solr. Поэтому я использую Spring data solr для этого, зависимость maven:

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

Затем я создаю класс конфигурации для конфигурации репозитория Solr. Благодаря Spring все просто и работает отлично.

@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);
    }

}

Затем я хочу добавить пользовательскую функцию для сохранения документов, поскольку преобразователь по умолчанию не может преобразовать мой вложенный объект Java. Я намерен использовать bean-компонент SolrClient или bean-компонент SolrTemplate для сохранения.

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;/
   }
}

Но путь автосвязывания SolrClient не получает solrCoreName пути от объекта документа (@Document(solrCoreName = "gettingstarted")). Это просто запрос к http://localhost:8983/solr, а не http://localhost:8983/solr/gettingstarted с именем ядра.

Я предполагаю, что solrCoreName будет установлен во время инициализации bean-компонентов репозитория, поэтому моя конфигурация не будет его содержать.

С другой стороны, я обнаружил, что bean-компонент SolrOperation из SimpleSolrRepository также становится нулевым, и все другие запросы, такие как findOne(), не могут работать должным образом.


person BurnetZhong    schedule 24.04.2017    source источник


Ответы (1)


Кажется, я неправильно понял некоторую концепцию Spring Data, которую мы не должны использовать с собственными SolrOperations.

Мы можем просто использовать SolrClient из SolrJ вместе со Spring Data. Вот мое простое решение.

Поскольку у меня несколько ядер в Solr, я создаю SolrClient (замена SolrServer в более старой версии) для каждого ядра в конфигурации.

@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");
}

Затем мы можем использовать его в нашем классе Solr dao, автоматически подключая bean-компонент SolrClient.

person BurnetZhong    schedule 25.04.2017
comment
Работает ли это для вас? В моем случае всякий раз, когда я вызываю метод, он продолжает создавать новые экземпляры. - person Maralc; 14.02.2018