Spring反应性验证消息

时间:2020-07-28 01:27:29

标签: spring-boot reactive-programming

美好的一天,我是使用Spring Boot Webflux(反应式编程框架)的初学者。您是否有关于如何将验证消息放入错误请求消息正文的想法。非常感谢

image

2 个答案:

答案 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()));
    }
}