如何在 Webflux/Webclient 中验证错误正文

问题描述

我有一个端点的处理程序方法,就是这个:

public Mono<ServerResponse> create(ServerRequest serverRequest) {

Validator validator = new createuserValidator();
Mono<UserDto> userDtoMono = serverRequest.bodyToMono(UserDto.class);

return userDtoMono.flatMap(user ->
{
    Errors errors = new BeanPropertyBindingResult(user,UserDto.class.getName());
    validator.validate(user,errors);
    if (errors == null || errors.getAllErrors().isEmpty()) {
        return userService.create(user).flatMap(aa -> ServerResponse.status(HttpStatus.CREATED)
                .contentType(MediaType.APPLICATION_JSON).body(fromValue(aa))).onErrorResume(this::handleException);
    } else {
        Set<String> errors1 = new HashSet<String>();
        errors.getAllErrors().forEach(message -> {
            errors1.add(message.getDefaultMessage());
        });
        return handleException(new InvalidAttributesException(errors1));
    }
});
}
private Mono<ServerResponse> handleException(Throwable exception) {
        ErrorResponse errorResponse = new ErrorResponse();

        if (exception instanceof InvalidAttributesException) {
            InvalidAttributesException asd = (InvalidAttributesException) exception;
            asd.getErrors().forEach(error ->
                    errorResponse.addMessage(messagesService.getMessage(error)));
        } else {
            errorResponse.addMessage(messagesService.getMessage(exception.getMessage()));

        }
        logger.info("Error:" + errorResponse);
        return ServerResponse.status(HttpStatus.BAD_REQUEST).body(fromValue(errorResponse));
    }

如您所见,如果验证器失败,该方法将返回一个错误的请求错误,并以 ErrorResponse 作为主体。

我使用 WebClient 来测试它。 WebClient 有一个过滤器,用于在出现错误状态时获取 ErrorResponse:

  WebClient client = WebClient.builder().clientConnector(new
            ReactorClientHttpConnector(HttpClient.create(ConnectionProvider.newConnection()))).filter(ExchangeFilterFunction.ofResponseProcessor(clientResponse ->
    {
        if (clientResponse.statusCode().isError()){
            return clientResponse.bodyToMono(ErrorResponse.class).flatMap(errorResponse ->
                Mono.error(new InvalidAttributesException(new HashSet<>(errorResponse.getMessages())))
            );
        }
        return Mono.just(clientResponse);
    })).baseUrl("http://localhost:8080").build();


Mono<ErrorResponse> response = (Mono<ErrorResponse>)  client.post().uri(thingsEndpoint(url)).accept( MediaType.APPLICATION_JSON ).body(Mono.just(userDto),UserDto.class).ti
                    .exchange();

response.subscribe(as -> {
            List<String> expectedMessages = new ArrayList<>();
            expectedMessages.add("name is mandatory");
            expectedMessages.add("email is mandatory");
            assertTrue(as.getMessages().containsAll(expectedMessages));
        });

但它不起作用。当我调试测试时,似乎调用 exchange() 方法时在调用端点之前返回异常。我做错了什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)