返回

如何解决 Spring Data Rest 中 FluxUsingWhen 无法转换为 Iterable 的错误?

java

使用 Spring Data Rest 和反应式存储库时解决 FluxUsingWhen 无法转换为 Iterable 的错误

引言

使用 Spring Data Rest 和反应式存储库时,一个常见的错误是 "class reactor.core.publisher.FluxUsingWhen cannot be cast to class java.lang.Iterable"。本指南将探讨此错误的原因,并逐步提供解决方案。

问题的原因

在使用 Spring Data Rest 访问反应式存储库时,存储库返回的 Flux 集合无法直接转换为 Iterable 集合。这是因为 Spring Data Rest 期望返回一个 Iterable 集合,而 Flux 是一个响应式流。

解决方案

要解决此错误,需要启用 Spring Data Rest 的 Projections 功能。 Projections 提供了一种机制,可以将反应式流转换为 Iterable 集合,从而与 Spring Data Rest 兼容。

步骤

1. 启用 Projections

application.properties 文件中添加以下属性:

spring.data.rest.projections.enabled=true

2. 创建 Projections 接口

为每个要公开的实体类型创建 Projections 接口。该接口应继承自 RepositoryRestProjection

public interface PostProjection extends RepositoryRestProjection<Post, String> {
    String getTitle();
    String getContent();
}

3. 配置 Projections

在 Spring Data Rest 的存储库接口上添加 @RestResource(projections = PostProjection.class) 注解,以指定要公开的 Projections 接口:

public interface PostRepository extends ReactiveCrudRepository<Post, String> {
    @RestResource(projections = PostProjection.class)
    Flux<Post> findAll();
}

4. 重新启动应用程序

应用更改后,重新启动应用程序。

其他注意事项

  • Projections 接口还可以包含方法来执行聚合或计算,例如总和或平均值。
  • 通过配置 Projections,可以控制哪些属性公开给客户端,并自定义返回集合的格式。
  • 此方法适用于 Spring Data Rest 2.6 及更高版本。

参考链接

常见问题解答

1. 什么是 Projections?

Projections 是 Spring Data Rest 的一种机制,可以将反应式流转换为 Iterable 集合。

2. 为什么需要启用 Projections?

启用 Projections 是为了使反应式存储库返回的 Flux 集合与 Spring Data Rest 的期望兼容。

3. 如何配置 Projections?

为要公开的实体类型创建 Projections 接口,并在存储库接口上使用 @RestResource(projections = PostProjection.class) 注解进行配置。

4. Projections 接口可以包含哪些方法?

Projections 接口可以包含获取实体属性的方法,还可以包含执行聚合或计算的方法。

5. 此方法适用于哪些 Spring Data Rest 版本?

此方法适用于 Spring Data Rest 2.6 及更高版本。