如果我们在现实生活中的软件项目中使用Spring Data Solr,很可能我们迟早会遇到一个要求,该要求指出我们的应用程序必须能够与本地Solr服务器和SolrCloud进行通信 。 目前,满足此要求意味着我们必须向所有Spring Data Solr存储库添加自定义方法。 这篇博客文章描述了如何做到这一点。

作为示例,我们将修改Spring Data Solr教程的上一部分的示例应用程序 。 在本博客中,我们将以某种方式更改该应用程序的自定义存储库实现,以将其所有方法都添加到所有存储库中。

注意:这当然是一个天真的示例,因为自定义接口及其实现都与TodoDocument类绑定。

我们可以按照以下步骤将自定义方法添加到所有存储库:

  1. 使用Maven获取所需的依赖项
  2. 创建一个声明自定义方法的接口。
  3. 实现创建的接口。
  4. 创建一个自定义存储库工厂bean。
  5. 将Spring Data Solr配置为使用自定义存储库工厂bean。

注意:这些博客文章提供了其他信息,可帮助我们理解此博客文章中描述的概念:

  • 使用Maven运行Solr
  • Spring Data Solr教程:Solr简介
  • Spring Data Solr教程:配置
  • Spring Data Solr教程:查询方法
  • Spring Data Solr教程:将自定义方法添加到单个存储库
  • Spring Data Solr教程:排序
  • Spring Data Solr教程:分页

闲聊就够了。 让我们开始吧。

使用Maven获取所需的依赖关系

这篇博客文章的示例应用程序使用Spring Data Solr的构建快照,因为它为实现自定义存储库工厂bean提供了更好的支持。 我们可以通过对POM文件进行以下更改来获得所需的依赖关系:

  1. 将Spring快照存储库添加到pom.xml文件的存储库部分。
  2. 更改Spring Data Solr依赖项的版本。

在以下小节中将更详细地描述这些步骤。

使用Spring快照存储库

通过将以下存储库配置添加到我们的POM文件中,我们可以使用Spring快照Maven存储库:

<repositories><repository><id>spring-snapshots</id><name>Spring Snapshot Maven Repository</name><url>http://repo.springsource.org/libs-snapshot</url></repository>
</repositories>

更新Spring Data Solr版本

通过将以下依赖项声明添加到pom.xml文件中,我们可以使用Spring Data Solr的构建快照。

<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-solr</artifactId><version>1.0.0.BUILD-SNAPSHOT</version>
</dependency>

创建自定义存储库界面

我们可以按照以下步骤为存储库创建一个自定义界面:

  1. 创建一个名为CustomBaseRepository的接口,该接口具有两个类型参数:文档类型( T )和文档IDID )。
  2. 确保CustomBaseRepository接口扩展了SolrCrudRepository接口。
  3. 使用@NoRepositoryBean批注对接口进行批注。 这样可以确保Spring Data Solr不会尝试为我们的接口创建实现。
  4. count()update()方法的方法声明添加到CustomBaseRepository接口。

CustomBaseRepository接口的源代码如下所示:

import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.solr.repository.SolrCrudRepository;import java.io.Serializable;@NoRepositoryBean
public interface CustomBaseRepository<T, ID extends Serializable> extends SolrCrudRepository<T, ID> {public long count(String searchTerm);public void update(Todo todoEntry);
}

下一步是实现创建的接口。 让我们找出这是如何完成的。

实施自定义存储库界面

我们可以按照以下步骤实现自定义存储库:

  1. 创建一个名为CustomBaseRepositoryImpl的类。 此类具有两个类型参数:文档的类型( T )和文档的ID( ID )的类型。
  2. 确保创建的类扩展SimpleSolrRepository类并实现CustomBaseRepository接口。
  3. 创建一个构造函数,该构造函数将SolrOperations对象和文档类的类型作为构造函数参数。 该构造函数的实现只是调用超类的构造函数。
  4. 实现update()方法。 因为此博客文章中已描述了此方法的实现,所以在此不再赘述。
  5. 实现count()方法。 同样,由于在前面已经介绍了此方法的实现,因此在此不再赘述。

CustomBaseRepositoryImpl类的源代码如下所示:

import org.springframework.data.solr.core.SolrOperations;
import org.springframework.data.solr.core.query.Criteria;
import org.springframework.data.solr.core.query.PartialUpdate;
import org.springframework.data.solr.core.query.SimpleQuery;
import org.springframework.data.solr.repository.support.SimpleSolrRepository;import java.io.Serializable;public class CustomBaseRepositoryImpl<T, ID extends Serializable> extends SimpleSolrRepository<T, ID> implements CustomBaseRepository<T, ID> {public CustomBaseRepositoryImpl(SolrOperations solrOperations, Class<T> entityClass) {super(solrOperations, entityClass);}@Overridepublic long count(String searchTerm) {String[] words = searchTerm.split(" ");Criteria conditions = createSearchConditions(words);SimpleQuery countQuery = new SimpleQuery(conditions);return getSolrOperations().count(countQuery);}private Criteria createSearchConditions(String[] words) {Criteria conditions = null;for (String word: words) {if (conditions == null) {conditions = new Criteria("title").contains(word).or(new Criteria("description").contains(word));}else {conditions = conditions.or(new Criteria("title").contains(word)).or(new Criteria("description").contains(word));}}return conditions;}@Overridepublic void update(Todo todoEntry) {PartialUpdate update = new PartialUpdate("id", todoEntry.getId().toString());update.add("description", todoEntry.getDescription());update.add("title", todoEntry.getTitle());getSolrOperations().saveBean(update);getSolrOperations().commit();}
}

让我们继续前进,了解如何创建自定义存储库工厂bean。

创建自定义存储库工厂Bean

存储库工厂bean是负责为存储库接口创建实现的组件。 因为我们要使用CustomBaseRepositoryImpl类作为Spring Data Solr存储库的实现,所以我们必须创建一个自定义存储库工厂bean。

我们可以按照以下步骤创建一个新的存储库工厂bean:

  1. 创建一个名为CustomSolrRepositoryFactoryBean的类,该类扩展了SolrRepositoryFactoryBean类。
  2. 将私有CustomSolrRepositoryFactory类添加到CustomSolrRepositoryFactory bean类。 该类扩展了SolrRepositoryFactory类,它具有两个类型参数:文档类型( T )和文档ID( ID )的类型。
  3. 重写SolrRepositoryFactoryBean类的doCreateRepositoryFactory()方法。 此方法的实现返回一个新的CustomSolrRepositoryFactory对象。

让我们仔细看看CustomSolrRepositoryFactory类的实现。 我们可以按照以下步骤实现它:

  1. 将一个SolrOperations字段添加到CustomSolrRepositoryFactory类。
  2. 将构造函数添加到CustomSolrRepositoryFactory类。 此类将使用的SolrOperations对象用作构造函数参数。 它的实现将仅调用超类的构造函数,并将接收到的SolrOperations对象设置为我们在第一步中创建的字段。
  3. 重写SolrRepositoryFactory类的getTargetRepository()方法并返回一个新CustomBaseRepositoryImpl对象。
  4. 重写SolrRepositoryFactory类的getRepositoryBaseClass()方法,并返回我们的自定义接口的类型。

而已。 我们的自定义存储库工厂bean的源代码如下所示:

import org.springframework.data.repository.core.RepositoryMetadata;
import org.springframework.data.repository.core.support.RepositoryFactorySupport;
import org.springframework.data.solr.core.SolrOperations;
import org.springframework.data.solr.repository.support.SolrRepositoryFactory;
import org.springframework.data.solr.repository.support.SolrRepositoryFactoryBean;import java.io.Serializable;public class CustomSolrRepositoryFactoryBean extends SolrRepositoryFactoryBean {@Overrideprotected RepositoryFactorySupport doCreateRepositoryFactory() {return new CustomSolrRepositoryFactory(getSolrOperations());}private static class CustomSolrRepositoryFactory<T, ID extends Serializable> extends SolrRepositoryFactory {private final SolrOperations solrOperations;public CustomSolrRepositoryFactory(SolrOperations solrOperations) {super(solrOperations);this.solrOperations = solrOperations;}@Overrideprotected Object getTargetRepository(RepositoryMetadata metadata) {return new CustomBaseRepositoryImpl<T, ID>(solrOperations, (Class<T>) metadata.getDomainType());}@Overrideprotected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {return CustomBaseRepository.class;}}
}

我们的下一个步骤是配置Spring Data Solr以使用我们刚创建的存储库工厂bean。 让我们开始吧。

配置Spring Data Solr

我们的最后一步是将Spring Data Solr配置为使用上一步中创建的新存储库工厂bean。 我们可以通过使用Java配置类或XML配置文件来实现。 以下小节将介绍这两个选项。

注意:为了清楚起见,简化了以下小节中介绍的不同配置文件。 实际上,我们的示例应用程序在开发和生产环境中具有不同的配置 。

Java配置

如果使用Java配置,则可以通过使用@EnableJpaRepositories批注的repositoryFactoryBeanBeanClass属性,将Spring Data Solr配置为使用自定义存储库工厂bean。 配置类的源代码如下所示:

import org.springframework.context.annotation.Configuration;
import org.springframework.data.solr.repository.config.EnableSolrRepositories;@Configuration
@EnableSolrRepositories(basePackages = "net.petrikainulainen.spring.datasolr.todo.repository.solr",repositoryFactoryBeanClass = CustomSolrRepositoryFactoryBean.class
)
public class SolrContext {//Configuration is omitted.
}

XML配置

当我们使用XML配置时,可以通过使用存储库名称空间元素的factory-class属性,将Spring Data Solr配置为使用自定义存储库工厂bean。 我们的应用程序上下文的XML配置文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:solr="http://www.springframework.org/schema/data/solr"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/data/solr http://www.springframework.org/schema/data/solr/spring-solr.xsd"><!-- Enable Solr repositories and configure repository base package --><solr:repositories base-package="net.petrikainulainen.spring.datasolr.todo.repository.solr"factory-class="net.petrikainulainen.spring.datasolr.todo.repository.solr.CustomSolrRepositoryFactoryBean"/><!-- The configuration is omitted. -->
</Beans>

摘要

现在,我们创建了两个自定义方法,这些方法已添加到示例应用程序的所有存储库中。 当然,就像我们前面学到的一样,该示例没有任何意义,因为我们的自定义存储库接口及其实现与TodoDocument类相关。

本教程教了我们两件事:

  • 我们可以使用@NoRepositoryBean批注向Spring Data Solr发信号, 通知它不应为使用@NoRepositoryBean批注的接口创建实现。
  • 我们可以使用@EnableSolrRepositories批注的repositoryFactoryBeanBeanClass属性或存储库名称空间元素的factory-class属性来配置自定义存储库工厂bean。

与往常一样,此博客的示例应用程序可在Github上获得 。

参考: Spring Data Solr教程:在Petri Kainulainen博客上,从我们的JCG合作伙伴 Petri Kainulainen 向所有存储库添加自定义方法 。

翻译自: https://www.javacodegeeks.com/2013/06/spring-data-solr-tutorial-adding-custom-methods-to-all-repositories.html

Spring Data Solr教程:向所有存储库添加自定义方法相关推荐

  1. Spring Data Solr教程:查询方法

    我们已经了解了如何配置Spring Data Solr. 我们还学习了如何向Solr索引添加新文档,如何更新现有文档的信息以及从Solr索引删除文档. 现在是时候继续前进,学习如何使用Spring D ...

  2. Spring Data Solr教程:将自定义方法添加到单个存储库

    我的Spring Data Solr教程的前一部分教我们如何使用查询方法创建静态查询. 自然而然的下一步将是描述如何使用Spring Data Solr创建动态查询. 但是,在继续讨论该主题之前,我们 ...

  3. Spring Data Solr教程:动态查询

    Solr通常被称为搜索服务器,我们可以在实现全文搜索功能时使用它. 但是,当我们实现从搜索表单获取其输入的搜索功能时,利用Solr的性能通常是明智的. 在这种情况下,执行的搜索查询取决于收到的输入. ...

  4. Spring Data Solr教程:排序

    当我们实现单词搜索功能时,我们通常希望通过使用每个搜索结果的相关性以降序对搜索结果进行排序. 这也是Solr的默认行为. 但是,在某些情况下,有必要手动指定排序顺序. 一种此类情况是"常规& ...

  5. Spring Data Solr教程:分页

    在我的Spring Data Solr教程的较早部分中,我们实现了一个简单的搜索功能,该功能用于搜索待办事项的信息. 我们搜索功能的当前实现将所有搜索结果显示在一个页面中. 对于大多数现实生活中的应用 ...

  6. Spring Data Solr教程:CRUD(差不多)

    在我的Spring Data Solr教程的上一部分中,我们学习了如何配置Spring Data Solr. 现在该迈出一步,了解我们如何管理Solr实例中存储的信息. 此博客文章描述了我们如何向So ...

  7. Spring Data Solr教程:配置

    在我的Spring Data Solr教程的上一部分中,我们了解到Solr提供了一个类似REST的HTTP API,该API可用于向Solr索引添加信息并针对索引数据执行查询. 问题在于,在开发环境中 ...

  8. Spring Data Solr教程:Solr简介

    大多数应用程序必须具有某种搜索功能. 问题在于搜索功能通常是巨大的资源消耗,它们可能通过给数据库造成沉重的负担而破坏我们应用程序的性能. 因此,将负载转移到外部搜索服务器是个好主意. 这是我的Spri ...

  9. Spring Boot和Spring Data REST –通过REST公开存储库

    使用Spring Boot和Spring Data REST,通过REST公开Spring Data存储库非常容易. 使用最少的代码,您可以创建遵循HATEOAS原理的JPA实体的REST表示. 我决 ...

最新文章

  1. 漫画 | 如果程序员的妈是产品经理,她会如何逼你结婚?
  2. bat java cp_批处理中Copy与Xcopy命令的区别小结
  3. 前端常见知识点五之Fetch
  4. 你觉得我的这段Java代码还有优化的空间吗?
  5. 分类任务如何用逻辑回归实现_如何用逻辑回归构建金融评分卡模型?(上)
  6. JavaScript——正则表达式
  7. 如何快速转载CSDN博客(详细)
  8. Codeforces Round #302 (Div. 2)
  9. 用JavaScript实现按钮点击全选和下拉列表根据省份复选框显示对应城市功能
  10. php mysql关键字查询_使用php mysql进行关键字搜索?
  11. FastReport 安装方法
  12. 用计算机播放cd,电脑上怎么放光盘_播放CD的方法步骤
  13. UOJ449. 【集训队作业2018】喂鸽子 [概率期望,min-max容斥,生成函数]
  14. 高度自律学习者的app
  15. cmd 新增dns_win10在cmd中修改dns方法教程
  16. 【协议分析】Gzip格式与解析
  17. 华为语音合成服务,为用户提供实时、可替换、多音调的语音播放体验
  18. 如何申请建立邮箱?收费邮箱申请流程有哪些
  19. MATLAB保存数据为txt或dat格式
  20. DirectX 3D灯光和材质

热门文章

  1. 我的控制反转,依赖注入和面向切面编程的理解
  2. Spring IOC 和 AOP 概览
  3. java中两任务并行运行_Java并行编程中的“可调用”与“可运行”任务
  4. gradle使用maven_使用Gradle – 2019版从Travis可靠发布到Maven Central
  5. jdk 8 时区 转换_使用JDK 8将收藏转换为地图
  6. java rop_Java命令行界面(第23部分):Rop
  7. java 拼图_功能项目拼图将Java 9引入
  8. 解耦,未解耦的区别_幂等与时间解耦之旅
  9. ejb生命周期_EJB 3.x:生命周期和并发模型(第2部分)
  10. angular8 rest_带有Angular JS的Java EE 7 – CRUD,REST,验证–第2部分