【问题标题】:Spring Boot validation, expect field when deserializing requestBody, but not from responseBodySpring Boot验证,反序列化requestBody时期望字段,但不是来自responseBody
【发布时间】:2019-12-31 16:59:24
【问题描述】:

我想知道 Spring Boot 的最佳实践。

我有一个 Spring Boot API,它基本上公开了另一个 API。 这是一个必要的邪恶。 外部 API 完全是一场灾难,我们不能直接将其暴露给我们的客户。

问题是这个 API 有时需要 requestBody 中的字段, 但不会将它们退还给消费者。

将其转换为 Spring Boot(Javax 验证或 Lombok)。 我不能只在这些字段上添加@Notnull 或@Nonnull 注释。 因为当 Jackson 尝试反序列化 responseBody 时它会失败。

我应该在这里做什么?

  • 我应该单独创建一个 ObjectIn 和 ObjectOut
  • 我是否应该删除注释并在 restController 中进行自定义条件检查
  • 我应该完全做其他事情吗

【问题讨论】:

    标签: java spring-boot validation jackson lombok


    【解决方案1】:

    如果请求和响应的负载不同,使用不同的类来表示它们可能是有意义的。为了处理将 DTO 映射到域模型(以及其他方式)的样板代码,您可以查看映射框架,例如 MapStruct,它与 Spring 很好地集成。

    除了为输入和输出定义不同的类之外,您还可以查看验证组

    【讨论】:

      【解决方案2】:

      假设数据以 JSON 结构传输。

      使用 @JsonProperty(value = "example_field_name", required = false) 将 required 设置为 false 来注释您的属性。如果 JSON-Structure 中缺少字段,Jackson 将不会抛出任何错误。

      JsonProperty Documentation

      【讨论】:

      • 当 requestBody 中缺少该字段时,它应该会抛出错误吗?只是不在 requestResponse 中。
      • 问题是你的异常是在哪里抛出的?正如您的问题所说,如果字段不存在,我假设您在反序列化数据结构时遇到问题。那么你是自己序列化结构,还是让 spring 为你做呢?以@RequestBody 为例?无论如何,如果您将属性定义为不需要,则反序列化不应抛出任何内容。没关系。如果您假设要设置一个特殊的属性星座,那么我建议您使用验证。
      猜你喜欢
      • 2021-02-07
      • 1970-01-01
      • 2014-09-10
      • 2015-09-01
      • 2018-02-09
      • 1970-01-01
      • 2020-01-19
      • 1970-01-01
      相关资源
      最近更新 更多