我的 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
将通用部件转化为可重用的方法,以提高可维护性并减少重复。
如果你的意思是这里所谓的异常处理是公共部分,那么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 年多了。但你的代码让我困惑。