如何在不更改返回类型的情况下重构基于 Mono 的服务方法中的重复逻辑?

问题描述 投票:0回答:1

我的 Spring Boot 控制器实现类中有两个方法。一个删除用户,另一个删除 TnC(条款和条件)。两种方法都包含用于错误处理和响应构造的重复逻辑。

我想重构这段代码,将公共部分提取为可重用的方法,以提高可维护性并减少重复。以下是这些方法的当前实现:

 @Override
public Mono<ResponseEntity<Void>> deleteUser(String userId, ServerWebExchange exchange) {
    HttpHeaders responseHeaders = createJsonHeaders();
    return userService
        .deleteUser(userId, exchange)
        .fold(
            error -> {
                log.error("Error in deleteUser: {}", error);
                return new ResponseEntity<>(null, responseHeaders, error.getStatusCode());
            },
            response -> new ResponseEntity<>(HttpStatus.NO_CONTENT));
}

@Override
public Mono<ResponseEntity<Void>> deleteTnC(String version, ServerWebExchange exchange) {
    HttpHeaders responseHeaders = createJsonHeaders();
    return tncService
        .deleteTnC(version, exchange)
        .fold(
            error -> {
                log.error("Error in deleteTnC: {}", error);
                return new ResponseEntity<>(null, responseHeaders, error.getStatusCode());
            },
            response -> new ResponseEntity<>(HttpStatus.NO_CONTENT));
}

我尝试将通用逻辑重构为可重用的方法,称为handleServiceCall。这是我写的实现:

private <T, R> Mono<ResponseEntity<R>> handleServiceCall(
    Mono<T> serviceCall,
    HttpStatus successStatus,
    java.util.function.Function<T, R> responseTransformer
) {
    HttpHeaders responseHeaders = createJsonHeaders();
    return serviceCall.map(response -> new ResponseEntity<>(
            responseTransformer.apply(response),
            responseHeaders,
            successStatus
        ))
        .onErrorResume(error -> {
            log.error("Error during service call: {}", error);
            return Mono.just(new ResponseEntity<>(null, responseHeaders, HttpStatus.INTERNAL_SERVER_ERROR));
        });
}

我的目标是消除deleteUser 和deleteTnC 方法中的重复代码。我想将这个重构的方法用于其他服务调用,例如 updateDomainsVerificationToken。

但是,我面临类型兼容性问题。例如:

服务(userService.deleteUser和tncService.deleteTnC)使用的fold方法返回EitherMono,它不直接符合Mono。 我对重构方法的返回类型以及如何在不修改现有服务调用方法或其返回类型的情况下将其与服务集成感到困惑。 我想重构这段代码,同时确保方法(Mono、Mono)的返回类型保持不变。任何有关解决这些问题或改进方法的指导将不胜感激。

spring spring-boot mono spring-webflux either
1个回答
0
投票

将通用部件转化为可重用的方法,以提高可维护性并减少重复。

如果你的意思是这里所谓的异常处理是公共部分,那么Spring WebFlux基于注释的编程风格也支持

@ExceptionHandleer
,因为它是在Spring WebMvc中提供的。

从 Spring 5.x 和 Spring 6.x 开始,Spring 为 RESTful API 开发人员提供了多种编程模型选项,无论是注释控制器声明还是函数式编程风格。在这里检查我的示例项目:https://github.com/hantsy/spring-puzzles/tree/master/programming-models

我在实际项目中使用 Spring WebFlux 已有 4 年多了。但你的代码让我困惑。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.