我想在 Reactive Spring Boot API 的 Controller 中以相同的方式处理多个异常。
这个想法是发送一个
HttpStatus.BAD_REQUEST
作为业务逻辑中多个类型的 Exception
的错误响应。
我的方法结束是这样的:
@PostMapping("/my-api")
public Mono<ResponseEntity<String>> save(@RequestBody JsonNode rawDto) {
return
myValidator.validate(rawDto)
.flatMap(validDto ->
myService.save(validDto))
.doOnSuccess(result->
new ResponseEntity<>(HttpStatus.OK))
.doOnError(MyValidationException.class, error->
new ResponseEntity<>(HttpStatus.BAD_REQUEST))
.doOnError(MyBusinessLogicException.class, error->
new ResponseEntity<>(HttpStatus.BAD_REQUEST))
.doOnError(MyRemoteApiException.class, error->
new ResponseEntity<>(HttpStatus.BAD_REQUEST))
.doOnError(MyDataConstraintException.class, error->
new ResponseEntity<>(HttpStatus.BAD_REQUEST)); // and so on
}
我想将多个异常合并在一个doOnError
块中。与此类似的东西:
.doOnError(MyValidationException.class
| MyBusinessLogicException.class
| MyRemoteApiException.class, // and so on
error->
new ResponseEntity<>(HttpStatus.BAD_REQUEST))
我不确定有什么方法可以组合多个异常。在寻找更好的选择之前,我不想使用
if
条件。如有任何帮助,我们将不胜感激。
提前致谢。
public final Flux<T> doOnError(Predicate<? super Throwable> predicate,
final Consumer<? super Throwable> onError)
与Set
:
private final Set<Class<?>> errors = Set.of(
MyValidationException.class,
MyBusinessLogicException.class,
MyRemoteApiException.class,
MyDataConstraintException.class
)
...
.doOnSuccess(result-> new ResponseEntity<>(HttpStatus.OK))
.doOnError(
error -> errors.contains(error.getClass()), // <---- now this is one predicate
error-> new ResponseEntity<>(HttpStatus.BAD_REQUEST)
)