答案 0 :(得分:0)
您可以在验证传入数据的层上执行类似的操作(将功能分为代表该层的多个@Service
/ @Component
类是一种好习惯:Rest Layer <-> Facade(validations )层<->业务逻辑层<->存储(持久性)层):
@Autowired private UserService userService;
@Override
public Mono<UserDatabaseModel> create(@NonNull UserDatabaseModel user) {
return validUserOrError(user)
.flatMap(userService::save);
}
private Mono<UserDatabaseModel> validUserOrError(@NonNull UserDatabaseModel userDatabaseModel) {
return (userDatabaseModel.getId() == null || userDatabaseModel.getId().isBlank())
? monoBadRequestError("User ID cannot be null or blank")
: Mono.defer(() -> Mono.just(userDatabaseModel));
}
private Mono<UserDatabaseModel> monoBadRequestError(@NonNull String message) {
return Mono.error(new ResponseStatusException(HttpStatus.BAD_REQUEST, message));
}
这样,如果用户ID无效,则会从validUserOrError()
函数发出错误,并且所有后续操作(例如map()
,flatMap()
等)都将被跳过,从而导致Http Bad Request错误该请求。否则,将发出服务层的结果(将用户保存到数据库)。我个人不对Spring webflux使用@NotBlank
注释,因为我发现在某些情况下它不兼容,而是使用我提供的结构。
答案 1 :(得分:0)
设置属性文件
server.error.include-message=always
并设置@ControllerAdvice
@ControllerAdvice
public class GlobalErrorHandler {
@ExceptionHandler(WebExchangeBindException.class)
public Mono<ServerResponse> handlerBindException(WebExchangeBindException e) {
return Mono.error(e.getFieldError() == null ? e :
new ResponseStatusException(HttpStatus.BAD_REQUEST,
e.getFieldError().getDefaultMessage()));
}
}