当前位置: 首页 > 知识库问答 >
问题:

如何验证/处理Spring WebClient响应?

高森
2023-03-14

因此,应用程序流程如下:

  1. Spring应用程序接收请求-

这是我正在使用的网络客户端(副本):

public Mono<Details> someRestCall(String name) {
        return this.webClient.get().url("/{id}/details", name)
                        .retrieve().bodyToMono(Details.class);
    }

现在我不想通过控制器将此Mono对象直接返回到客户端(如Angular应用程序),因为这是一个中间步骤。我想对从 WebClient 收到的响应运行一些验证。

我已经试过<代码>。block()方法来检索函数,但是按照反应式编程,这似乎是一种不好的做法。(阻塞操作)此外,我无法理解如何使用<代码>。subscribe()方法来检索响应对象,并对其运行验证/检查,如果验证通过,则返回< code>True。

简单地说,我想返回一个普通的布尔值/Java对象,而不是从模块/验证代码返回一个Mono对象。

我是反应式编程的新手,有人能帮我解决这个问题吗?

共有1个答案

融伯寅
2023-03-14

只需稍加努力,您就可以对WebClient调用返回的POJO使用基于JSR-303注释的验证。这是一个最小的示例:

@Component
public class MyClass {

  final Validator validator;

  MyClass(Validator validator) {
    this.validator = validator;
  }

  <T> T validate(T obj) {

    Set<ConstraintViolation<T>> violations = this.validator.validate(obj);
    if (violations.size() > 0) {
      throw new ResponseStatusException(INTERNAL_SERVER_ERROR, violations.toString());
    }

    return obj;
  }

  public Mono<Details> someRestCall(String name) {
    return this.webClient.get()
        .url("/{id}/details", name)
        .retrieve()
        .bodyToMono(Details.class)
        .doOnNext(this::validate);
  }
}

在实践中,您可能需要一个格式更好的冲突字符串,如果在几个位置完成验证,则可以将该逻辑提升到其自己的类中。

 类似资料:
  • 我用Spring Boot Rest实现了控制器: DTO回应道: 未验证响应正文。我已经用< code>@Valid对其进行了注释,但是< code>null值仍然通过。请求验证工作良好。 如何验证响应正文?

  • 在使用空手道框架进行API测试时,我在验证嵌套JSON响应时遇到了一些问题。 JSON响应: null def feed_cycle={item_type:'#string',title:'#string'} def feed_college_dept_branch={branch:'#string'} def feed_college={item_type:'#string',dept:'[]f

  • 我正在尝试使用Web客户端创建REST调用 我只想记录通话结果。成功时 - 使用响应正文记录成功消息,在 5XX 或超时或其他时 - 记录错误消息。日志应该在后台创建(而不是由创建调用的线程创建)但是每次都会执行,工作正常,但也有 记录在日志文件中。 我也在一些教程中看到过方法,但在我的设置中有这样的方法。 如何记录成功和失败消息?

  • 问题内容: 尝试进行某些路由需要身份验证。 我有这个: 注意:是的,身份验证服务可以正常工作。 对于每条路由,我都会检查用户是否已通过身份验证,如果没有通过身份验证,则要将他们重定向到登录页面,如果已通过身份验证,则它将以“ /”路由登陆到第一页。 我得到的是: 我在哪里做错了? 问题答案: 一个简单的解决方案是制作一个包含所有受保护路线的(高阶组件)。 根据您的应用程序的嵌套方式,您可能需要利用

  • 我正试图决定如何处理猫鼬中的验证错误。 我使用节点验证器定义了自己的验证规则,例如: 这将产生如下错误: 然而,节点验证器提供了自己的错误消息。如果我使用mongoose validator节点模块将节点验证器直接插入到我的模式中,那么我可以直接使用这些错误消息: 这将生成一条错误消息,如下所示: 我也可以在此处提供自定义错误消息: Mongoose允许您根据需要定义字段: 这将生成一条错误消息,

  • 如何在处理正文请求之前验证身份验证? 我正在使用vertx: 我想在处理正文请求之前验证身份验证。但我得到了错误的java。lang.IllegalStateException:请求已被读取 使用暂停功能上的延迟复制: 当运行delay(100)时(这是验证过程的示例),我得到了上面的错误。如果我对延迟(100)进行注释,它可以正常工作。