原标题:Spring认证中国教育管理中心-Spring Data Elasticsearch教程四(Spring中国教育管理中心)
8.4.存储库方法的注释
8.4.1.@强调
存储库方法上的@Highlight注释定义了应包含返回的实体突出显示的哪些字段。要在 a 的名称或摘要中搜索某些文本Book并突出显示找到的数据,可以使用以下存储库方法:
interface BookRepository extends Repository<Book, String> {
@Highlight(fields = {
@HighlightField(name = "name"),
@HighlightField(name = "summary")
})
List<SearchHit<Book>> findByNameOrSummary(String text, String summary);
}
可以像上面一样定义多个要突出显示的字段,并且可以使用注释进一步自定义the@Highlight和annotation。检查 Javadocs 以获得可能的配置选项。@HighlightField@HighlightParameters
在搜索结果中,可以从SearchHit类中检索高亮数据。
8.5。基于注释的配置
Spring Data Elasticsearch 存储库支持可以通过 JavaConfig 使用注释激活。
示例 80. 使用 JavaConfig 的 Spring Data Elasticsearch 存储库
@Configuration
@EnableElasticsearchRepositories(
basePackages = "org.springframework.data.elasticsearch.repositories"
)
static class Config {
@Bean
public ElasticsearchOperations elasticsearchTemplate() {
// ...
}
}
class ProductService {
private ProductRepository repository;
public ProductService(ProductRepository repository) {
this.repository = repository;
}
public Page<Product> findAvailableBookByName(String name, Pageable pageable) {
return repository.findByAvailableTrueAndNameStartingWith(name, pageable);
}
}
EnableElasticsearchRepositories注释激活存储库支持。如果没有配置基本包,它将使用它所放置的配置类之一。
使用Elasticsearch Operations一章中显示的配置之一提供一个名为elasticsearchTemplatetype的 Bean。ElasticsearchOperations
让 Spring 将 Repository bean 注入到您的类中。
8.6.使用 CDI 的 Elasticsearch 存储库
Spring Data Elasticsearch 存储库也可以使用 CDI 功能进行设置。
示例 81. 使用 CDI 的 Spring Data Elasticsearch 存储库
class ElasticsearchTemplateProducer {
@Produces
@ApplicationScoped
public ElasticsearchOperations createElasticsearchTemplate() {
// ...
}
}
class ProductService {
private ProductRepository repository;
public Page<Product> findAvailableBookByName(String name, Pageable pageable) {
return repository.findByAvailableTrueAndNameStartingWith(name, pageable);
}
@Inject
public void setRepository(ProductRepository repository) {
this.repository = repository;
}
}
使用与Elasticsearch 操作一章中使用的相同调用来创建组件。
让 CDI 框架将存储库注入到您的类中。
8.7.春天命名空间
Spring Data Elasticsearch 模块包含一个自定义命名空间,允许定义存储库 bean 以及用于实例化ElasticsearchServer.
使用该repositories元素查找 Spring Data 存储库,如创建存储库实例中所述。
示例 82. 使用命名空间设置 Elasticsearch 存储库
<?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:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/data/elasticsearch
https://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd">
<elasticsearch:repositories base-package="com.acme.repositories" />
</beans>
使用Transport Clientor元素在上下文中Rest Client注册一个实例。Elasticsearch Server
示例 83. 使用命名空间的传输客户端
<?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:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/data/elasticsearch
https://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd">
<elasticsearch:transport-client id="client" cluster-nodes="localhost:9300,someip:9300" />
</beans>
示例 84. 使用命名空间的 Rest 客户端
<?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:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
xsi:schemaLocation="http://www.springframework.org/schema/data/elasticsearch
https://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch.xsd
http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<elasticsearch:rest-client id="restClient" hosts="http://localhost:9200">
</beans>
9. 审计
9.1基本
Spring Data 提供了复杂的支持来透明地跟踪谁创建或更改了实体以及更改发生的时间。要从该功能中受益,您必须为实体类配备审计元数据,这些元数据可以使用注释或通过实现接口来定义。此外,必须通过 Annotation 配置或 XML 配置启用审计,以注册所需的基础架构组件。有关配置示例,请参阅特定于商店的部分。
仅跟踪创建和修改日期的应用程序不需要指定AuditorAware.
9.1.1。基于注释的审计元数据
我们提供@CreatedBy并@LastModifiedBy捕获创建或修改实体的用户,以及@CreatedDate捕获@LastModifiedDate更改发生的时间。
示例 85. 被审计实体
class Customer {
@CreatedBy
private User user;
@CreatedDate
private Instant createdDate;
// … further properties omitted
}
如您所见,可以有选择地应用注释,具体取决于您要捕获的信息。DateTime可以在 Joda-Time, , legacy Java Dateand Calendar, JDK8 date and time types, and longor类型的属性上使用捕获更改时的注释Long。
审核元数据不一定需要存在于根级别实体中,但可以添加到嵌入式实体中(取决于实际使用的存储),如下面的片段所示。
示例 86. 嵌入实体中的审计元数据
class Customer {
private AuditMetadata auditingMetadata;
// … further properties omitted
}
class AuditMetadata {
@CreatedBy
private User user;
@CreatedDate
private Instant createdDate;
}
9.1.2.基于接口的审计元数据
如果您不想使用注释来定义审核元数据,您可以让您的域类实现该Auditable接口。它公开了所有审计属性的 setter 方法。
9.1.3.AuditorAware
如果您使用@CreatedBy或@LastModifiedBy,审计基础架构需要以某种方式了解当前主体。为此,我们提供了一个AuditorAware<T>SPI 接口,您必须实现该接口来告诉基础设施当前与应用程序交互的用户或系统是谁。泛型类型T定义了属性注释@CreatedBy或@LastModifiedBy必须是什么类型。
以下示例显示了使用 Spring SecurityAuthentication对象的接口实现:
示例 87.AuditorAware基于 Spring Security的实现
class SpringSecurityAuditorAware implements AuditorAware<User> {
@Override
public Optional<User> getCurrentAuditor() {
return Optional.ofNullable(SecurityContextHolder.getContext())
.map(SecurityContext::getAuthentication)
.filter(Authentication::isAuthenticated)
.map(Authentication::getPrincipal)
.map(User.class::cast);
}
}
实现访问AuthenticationSpring Security 提供的对象并查找UserDetails您在UserDetailsService实现中创建的自定义实例。我们在这里假设您通过UserDetails实现公开域用户,但是根据Authentication找到的结果,您也可以从任何地方查找它。
9.1.4。ReactiveAuditorAware
使用反应式基础架构时,您可能希望利用上下文信息来提供@CreatedBy信息@LastModifiedBy。我们提供了一个ReactiveAuditorAware<T>SPI 接口,您必须实现该接口来告诉基础设施当前与应用程序交互的用户或系统是谁。泛型类型T定义了属性注释@CreatedBy或@LastModifiedBy必须是什么类型。
以下示例显示了使用响应式 Spring SecurityAuthentication对象的接口实现:
示例 88.ReactiveAuditorAware基于 Spring Security的实现
class SpringSecurityAuditorAware implements ReactiveAuditorAware<User> {
@Override
public Mono<User> getCurrentAuditor() {
return ReactiveSecurityContextHolder.getContext()
.map(SecurityContext::getAuthentication)
.filter(Authentication::isAuthenticated)
.map(Authentication::getPrincipal)
.map(User.class::cast);
}
}
实现访问AuthenticationSpring Security 提供的对象并查找UserDetails您在UserDetailsService实现中创建的自定义实例。我们在这里假设您通过UserDetails实现公开域用户,但是根据Authentication找到的结果,您也可以从任何地方查找它。
9.2.Elasticsearch 审计
9.2.1。准备实体
为了让审计代码能够判断一个实体实例是否是新的,实体必须实现Persistable<ID>如下定义的接口:
package org.springframework.data.domain;
import org.springframework.lang.Nullable;
public interface Persistable<ID> {
@Nullable
ID getId();
boolean isNew();
}
由于 Id 的存在不足以判断一个实体在 Elasticsearch 中是否是新的,因此需要额外的信息。一种方法是为此决策使用与创建相关的审计字段:
Person实体可能如下所示 - 为简洁起见,省略了 getter 和 setter 方法:
@Document(indexName = "person")
public class Person implements Persistable<Long> {
@Id private Long id;
private String lastName;
private String firstName;
@CreatedDate
@Field(type = FieldType.Date, format = DateFormat.basic_date_time)
private Instant createdDate;
@CreatedBy
private String createdBy
@Field(type = FieldType.Date, format = DateFormat.basic_date_time)
@LastModifiedDate
private Instant lastModifiedDate;
@LastModifiedBy
private String lastModifiedBy;
public Long getId() {
return id;
}
@Override
public boolean isNew() {
return id == null || (createdDate == null && createdBy == null);
}
}
getter 是接口所需的实现
如果一个对象没有id或没有设置包含创建属性的字段,则该对象是新的。
9.2.2.激活审计
在设置实体并提供AuditorAware- 或ReactiveAuditorAware- 后,必须通过设置@
EnableElasticsearchAuditing配置类来激活审计:
@Configuration
@EnableElasticsearchRepositories
@EnableElasticsearchAuditing
class MyConfiguration {
// configuration code
}
使用反应式堆栈时,这必须是:
@Configuration
@EnableReactiveElasticsearchRepositories
@EnableReactiveElasticsearchAuditing
class MyConfiguration {
// configuration code
}
如果您的代码包含多个AuditorAware不同类型的 bean,则必须提供 bean 的名称以用作注解参数的auditorAwareRef参数 。@
EnableElasticsearchAuditing