如何解决Spring 数据反应式存储库 - r2dbc 不工作
查询正在执行,但没有得到任何结果。
路由器:- 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
不知道这有什么问题。它不返回记录。
解决方法
这里的问题是需要订阅响应式代码才能开始执行。以下声明仅描述了应该发生的情况:
Flux<Appt> appts = projectRepository.findApptsBetween(stDate,endDate,userId,usr.getOrgId());
要开始执行,需要在响应式调用中添加 .subscribe()
运算符。但是在这里您不希望那样,因为这将在不同的上下文/线程中开始执行,并且您将无法将值返回给外部方法。这就是为什么应该将响应式代码编写为响应式调用链。
(注意:控制器方法和路由器函数在您的代码末尾有一个隐式 .subscribe()
,因此您不需要添加它)
你可以将这段代码改写成这样:
return secContext.retrieveUser().flatMap(usr ->
projectRepository.findApptsBetween(stDate,usr.getOrgId())
.collectList()
.map(appts -> ServerResponse.ok().contentType(APPLICATION_JSON).body(appts,Project.class));
,
以下代码有效。答案已从上述帖子中修改。
return secContext.retrieveUser()
.flatMap(usr -> apptRepository.findApptsBetween(userId,usr.getOrgId(),stDate,endDate).collectList()
.flatMap(appts -> ServerResponse.ok().contentType(APPLICATION_JSON).bodyValue(appts)));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。