当前位置: 首页 > 知识库问答 >
问题:

Spring数据反应式存储库-r2dbc不工作

陆翔飞
2023-03-14

正在执行查询,但未得到任何结果。

路由器:-api/v1/service/appt/usr/{usr_id}

private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");

public Mono<ServerResponse> retrieveProjectsByUsr(ServerRequest request) {
        final String userIdStr = request.pathVariable(USER_ID_PARAM);
        final Optional<String> stDateStr = request.queryParam("stDate");
        final Optional<String> endDateStr = request.queryParam("endDate");

        final LocalDateTime stDate = LocalDateTime.parse(stDateStr.get(), DATE_TIME_FORMATTER);
        final LocalDateTime endDate = LocalDateTime.parse(endDateStr.get(), DATE_TIME_FORMATTER);
        long userId = Long.parseLong(userIdStr);

        return secContext.retrieveUser().flatMap(usr -> {
            Flux<Appt> appts = projectRepository.findApptsBetween(stDate, endDate, userId, usr.getOrgId());
            return ServerResponse.ok().contentType(APPLICATION_JSON).body(appts, Project.class);
        });
    }

存储库代码,

@Repository
public interface ApptRepository extends ReactiveCrudRepository<Appt, Long> {
    
    @Query("select * from appt where usr_id = :usrId and org_id = :orgId and start_time BETWEEN :stDate and :endDate")
    Flux<Appt> findApptsBetween(LocalDateTime stDate, LocalDateTime endDate, long usrId, int orgId);

}

日志中查询,

Executing SQL statement [select * from appt where usr_id = :usrId and org_id = :orgId and start_time BETWEEN :stDate and :endDate]

项目表中的数据,

邮递员请求,

http://localhost:9090/api/v1/service/appt/usr/2?stDate=2021-01-24 03:20&endDate=2021-03-25 05:23

不确定这有什么问题。它不会返回记录。

共有2个答案

薄高懿
2023-03-14

以下代码有效。答案是从上面的帖子修改的。

return secContext.retrieveUser()
                .flatMap(usr -> apptRepository.findApptsBetween(userId, usr.getOrgId(), stDate, endDate).collectList()
                        .flatMap(appts -> ServerResponse.ok().contentType(APPLICATION_JSON).bodyValue(appts)));
向嘉誉
2023-03-14

这里的问题是,反应性代码需要被重新编译,才能开始执行。以下语句仅描述应发生的情况:

<代码>通量

要初始化执行,需要添加。subscribe()操作员响应调用。但这里您不希望这样,因为这将在不同的上下文/线程中开始执行,并且您无法将值返回给外部方法。这就是为什么应该将反应性代码编写为反应性调用链的原因。(注意:控制器方法和路由器函数在代码末尾有一个隐式的.subscribe(),因此不需要添加它)

您可以将此代码重新连接到如下内容:

return secContext.retrieveUser().flatMap(usr -> 
        projectRepository.findApptsBetween(stDate, endDate, userId, usr.getOrgId())
         .collectList()
         .map(appts -> ServerResponse.ok().contentType(APPLICATION_JSON).body(appts, Project.class));
        
 类似资料:
  • 我尝试创建一些基于反应式堆栈(反应器WebFlux)的基本Spring 5应用程序。 我的下一个目标是实现能够: 保存书籍。 查找所有图书。 我的存储库需要涵盖以下场景: 方案 A: 没有人订阅FindAll 有人保存了一本书(id=1) Client1订阅FindAll 书籍(id=1)被推送到Client1(Client1保持订阅状态,流未完成!) 有人保存了一本书(id=2) 书籍(id=2

  • 我是Spring data neo4j的新手,我对GraphRepository有一些错误/问题。 我第一次有了这个: 但是阅读一些文档,存储库已经提供了这样的方法。我不需要写它们。 这是我的产品域名。 这是我的实验班 未检测到查找字节 Id 这正常吗? 这是我的pom.xml

  • 这里已经提出并回答了类似的问题。解决方案是将日志记录级别从组织:: 我的情况的不同之处在于,我使用的是被动支持,上面的坏男孩不起作用。我还尝试将 中的所有内容都设置为 DEBUG,但仍然无法在日志中看到任何查询。 我想反应式存储库有一些特别的地方,我没有提到。任何想法都非常欢迎!

  • 嗨,我有一个使用Spring 5、Spring Data、Spring AOP和Java 11的应用程序(我也在使用JAVA 9模块系统)。我的spring-context/spring-aspects版本是5.1.2.RELEASE Spring数据版本是2.1.2.RELEASE这两个版本都是最新的。我以下列方式创建了存储库: 我已启用Spring Data Repositories使用 在我

  • 当我启动应用程序时,我得到了错误我的Pom有以下依赖项,我使用的是 下面是我的存储库接口。 当我启动应用程序时,它会抛出错误: 可以有人请建议如果JPA不支持,然后我应该使用什么,任何帮助都是感激的…

  • 我第一次使用SpringData反应式存储库。 我已经过了官方的留档,我创建了一个基本的CRUD API来使用它们。 我从H2开始,只是为了简单起见,一切都按预期进行。 当我尝试创建新实体时,一切正常: 代码非常简单(与SpringData Repositories一样): 和控制器: DTO也非常简单: 然后我在文档中检查Oracle也受支持。 我查看了Oracle驱动程序的官方文档。 确实,该