Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为多个核心和存储库使用Spring Data Solr实现自定义Solr存储库_Java_Spring_Solr_Solrj_Spring Data Solr - Fatal编程技术网

Java 如何为多个核心和存储库使用Spring Data Solr实现自定义Solr存储库

Java 如何为多个核心和存储库使用Spring Data Solr实现自定义Solr存储库,java,spring,solr,solrj,spring-data-solr,Java,Spring,Solr,Solrj,Spring Data Solr,我想使用SpringDataSolr在一个服务中访问多个/2个repo。 据我所知,“不幸的是,通过名称空间配置支持多核是一个开放的问题” 你能帮我举个例子吗?我怎样才能创建自定义回购协议 My applicationContext.xml有两个定义如下的Solr模板: <!-- Enable Solr repositories and configure repository base package --> <solr:repositories base-package="

我想使用SpringDataSolr在一个服务中访问多个/2个repo。 据我所知,“不幸的是,通过名称空间配置支持多核是一个开放的问题”

你能帮我举个例子吗?我怎样才能创建自定义回购协议

My applicationContext.xml有两个定义如下的Solr模板:

<!-- Enable Solr repositories and configure repository base package -->
<solr:repositories base-package="com.ay.api.repository"/>

<!-- Configures HTTP Solr server -->
<solr:solr-server id="solrServer" url="${solr.server.url}"/>

<!-- Configures Solr Events template -->
   <bean id="solrEventsTemplate" class="org.springframework.data.solr.core.SolrTemplate">
   <qualifier type="solrEventsTemplate"/>
   <constructor-arg index="0" ref="solrServer"/>
   <constructor-arg index="1" value="${solr.server.events.core.name}"/>
</bean>

<!-- Configures Solr Towns template -->
<bean id="solrTownsTemplate" class="org.springframework.data.solr.core.SolrTemplate">
<constructor-arg index="0" ref="solrServer"/>
<constructor-arg index="1" value="${solr.server.towns.core.name}"/>
</bean>
有人能告诉我如何修改代码以实现中提到的自定义存储库吗?因为我无法理解此线程中建议的解决方案


非常感谢。

存储库扫描将查找
solrTemplate
,并使用提供的模板创建存储库。由于每个Solr核心需要一个模板,所以必须手动创建模板和存储库

首先创建存储库和自定义实现

public interface EventRepositoryCustom {

    Page<Event> findEvent();

}

public interface EventRepository extends EventRepositoryCustom, SolrCrudRepository<Event, String> {

}

public class EventRepositoryImpl implements EventRepositoryCustom {

    private SolrTemplate eventTemplate;

    public EventRepositoryImpl(SolrTemplate eventTemplate) {
        this.eventTemplate = eventTemplate;
    }

    @Override
    public Page<Event> findEvent() {
        return eventTemplate.queryForPage(new SimpleQuery("*:*"), Event.class);
    }

}

当我按照答案中的建议这样做时,我得到了PersistenceExceptionTranslator异常,所以我手动初始化这个bean:

<beans:bean id="PersistenceExceptionTranslator" class="org.springframework.data.solr.core.SolrExceptionTranslator"/>


Hi@Itai-Peleg,它对我有效,无需手动初始化这个额外的bean。像往常一样,它是一个完美的解决方案。非常感谢您的快速回复。Cheers@Christoph-根据Spring的说法,Strobl,发布的答案显然不再有效。没有这种自动配置功能,您的解决方案是如何工作的?我们真的需要找到一种方法来使用多个solr实例,但只遇到了问题。这在最新的spring数据solr上不起作用。类已被删除(例如SolrServerFactory)。任何解决方案?只需使用相应的
SolrClientFactory
。嗨,使用最新的spring数据,这不起作用。存储库从实体获取核心。这会导致一个错误,因为它试图从位于的服务器上执行select on
错误http://localhost:8983/solr/events/events/select […]错误404未找到
模板工作正常。现在可以按照此处的说明设置具有多个存储库的多个内核
public interface EventRepositoryCustom {

    Page<Event> findEvent();

}

public interface EventRepository extends EventRepositoryCustom, SolrCrudRepository<Event, String> {

}

public class EventRepositoryImpl implements EventRepositoryCustom {

    private SolrTemplate eventTemplate;

    public EventRepositoryImpl(SolrTemplate eventTemplate) {
        this.eventTemplate = eventTemplate;
    }

    @Override
    public Page<Event> findEvent() {
        return eventTemplate.queryForPage(new SimpleQuery("*:*"), Event.class);
    }

}
@Configuration
public class SolrContext {

  private static final String PROPERTY_NAME_SOLR_SERVER_URL = "solr.host";

  @Resource
  private Environment environment;

  // Factory creates SolrServer instances for base url when requesting server
  // for specific core. 
  @Bean
  public SolrServerFactory solrServerFactory() {
    return new MulticoreSolrServerFactory(new HttpSolrServer(
            environment.getRequiredProperty(PROPERTY_NAME_SOLR_SERVER_URL)));
  }

  // SolrTemplate for /solrServerUrl/towns
  @Bean
  public SolrTemplate townTemplate() throws Exception {
    SolrTemplate solrTemplate = new SolrTemplate(solrServerFactory());
    solrTemplate.setSolrCore("towns");
    return solrTemplate;
  }

  // SolrTemplate for /solrServerUrl/events
  @Bean
  public SolrTemplate eventTemplate() throws Exception {
    SolrTemplate solrTemplate = new SolrTemplate(solrServerFactory());
    solrTemplate.setSolrCore("events");
    return solrTemplate;
  }

  @Bean
  public EventRepository eventRepository() throws Exception {
    return new SolrRepositoryFactory(eventTemplate())
      .getRepository(EventRepository.class, new EventRepositoryImpl(eventTemplate()));
  }

  @Bean
  public TownRepository townRepository() throws Exception {
    return new SolrRepositoryFactory(townTemplate())
      .getRepository(TownRepository.class, new TownRepositoryImpl(townTemplate()));
  }
}
<beans:bean id="PersistenceExceptionTranslator" class="org.springframework.data.solr.core.SolrExceptionTranslator"/>