【问题标题】:How to validate/process the Spring WebClient response?如何验证/处理 Spring WebClient 响应?
【发布时间】:2020-09-07 06:06:01
【问题描述】:

所以应用流程是这样的:

  1. Spring 应用收到请求 -> {"id": "UUID"}
  2. 使用 WebClient 调用外部 Web 服务
  3. 验证在步骤 2 中从 WebClient 收到的响应。如果验证通过,则返回 true 或 false。
  4. 执行其他验证操作(通过调用其他进程或 ext 服务)并将响应发回给用户。

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

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

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

我已尝试使用 .block() 方法来检索函数,但根据反应式编程,这似乎是一种不好的做法。 (阻止操作) 另外,我无法理解如何使用.subscribe() 方法来检索响应对象并对其运行验证/检查,如果验证通过则返回True

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

我是响应式编程的新手,谁能帮我解决这个问题?

【问题讨论】:

  • 不,你没有。你想在检索后返回一个Mono&lt;Boolean&gt;,调用map,执行你的逻辑并返回一个Mono&lt;Boolean&gt;
  • @m-deinum 你能提供一个相同的代码示例吗?我尝试了 .map 的东西,但遇到了错误。
  • 你尝试了什么,将它添加到你的问题中。
  • 得到了它的工作,但仍然有一个疑问希望你能帮助我。我应该如何查看 Mono 并检查内容以做出一些决定,而不阻塞线程?
  • 使用map。什么决定,你需要做什么?会影响结果吗?

标签: java spring spring-boot reactive-programming


【解决方案1】:

只需稍加努力,您就可以对 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);
  }
}

在实践中,您可能需要格式更好的违规字符串,如果在几个地方进行了验证,那么您可以将该逻辑提升到自己的类中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2018-10-17
    • 2023-04-10
    • 2013-04-24
    • 2018-02-23
    • 2018-08-18
    • 2020-06-03
    相关资源
    最近更新 更多