Spring WebFlux R2dbc 查询单条数据更新过期时间的代码优化问题
响应式租户过期时间更新接口优化方案
// 推荐改用构造器注入,替代字段注入 private final R2dbcEntityTemplate r2dbcEntityTemplate; public TenantController(R2dbcEntityTemplate r2dbcEntityTemplate) { this.r2dbcEntityTemplate = r2dbcEntityTemplate; } /** * 更新租户过期时间 * @param vo 请求参数 格式为 {tenantId:"", day:"1"} * @return 租户不存在返回404,更新成功返回204,乐观锁冲突返回409 */ @PatchMapping public Mono<ResponseEntity<Void>> updateTime(@Valid @RequestBody TenantUpdate vo) { return r2dbcEntityTemplate .selectOne(query(where("tenant_id").is(vo.getTenantId())), Tenant.class) // 同步修改实体属性用map即可,不需要flatMap .map(db -> { LocalDateTime baseTime = db.getTenantExpiredTime() != null ? db.getTenantExpiredTime() : LocalDateTime.now(); db.setTenantExpiredTime(baseTime.plusDays(vo.getDay())); return db; }) .flatMap(r2dbcEntityTemplate::update) // 同步转换为响应结果用map即可 .map(updated -> ResponseEntity.noContent().<Void>build()) // 处理乐观锁冲突异常 .onErrorResume(ObjectOptimisticLockingFailureException.class, e -> Mono.just(ResponseEntity.status(HttpStatus.CONFLICT).build())) // 租户不存在返回404 .switchIfEmpty(Mono.fromSupplier(() -> ResponseEntity.notFound().build())); }
核心优化说明
- 移除冗余类型强转:删除了原代码中不必要的
Function泛型强转,Java编译器可自动推导流中数据类型,代码更简洁 - 响应式API语义优化:纯同步的对象属性修改、结果转换操作统一使用
map,替代flatMap + Mono.just的冗余写法,符合响应式编程的API设计规范,也降低了不必要的包装开销 - 空值逻辑简化:用三目运算简化了过期时间为空的兜底逻辑,替代多行if判断,代码可读性更高
- 注入方式优化:将
@Autowired字段注入改为构造器注入,符合Spring官方推荐规范,同时方便后续编写单元测试时手动注入mock对象 - 异常处理补全:新增了乐观锁冲突异常的捕获逻辑,返回409 Conflict状态码,符合RESTful接口设计规范
- 新增参数校验:在请求参数前加
@Valid注解,可配合TenantUpdate类中的@NotBlank(校验tenantId非空)、@Min(value = 1, message = "增加天数不能小于1")注解,提前拦截非法请求,避免无效数据库查询
内容的提问来源于stack exchange,提问作者zy_sun
相关产品推荐
相关产品推荐

