【问题标题】:Need to Reject POST/PUT request if any unknown field is present in RequestBody如果 RequestBody 中存在任何未知字段,则需要拒绝 POST/PUT 请求
【发布时间】:2020-07-20 17:44:34
【问题描述】:

@Valid 检查适用于各个字段。如果 POST/PUT 请求的 JSON 请求正文中存在任何未知字段,有什么方法可以拒绝请求。下面是我的示例 DTO 类和控制器。 对于以下示例请求正文(例如),请求应被拒绝/抛出异常。 任何帮助或建议将不胜感激。

{
"accountid" : "P12345",
"name" : "Cardiology",
"domain" : "Apollo"
}

public class Account {

    @NotEmpty(message = "accountid is required")
    private String accountid;

    @NotEmpty(message = "name is required")
    private String name;

   //getters & setters

}

**********************************************************************************************

public class BeanController {

    @PostMapping(path = "/accounts")
    public ResponseEntity<?> getAllAccounts(@RequestBody @Valid Account account) {

        System.out.println("::: Account is " + account + " :::");

        return ResponseEntity.ok().body("SUCCESS");

    }
}

【问题讨论】:

  • 您已经得到了答案。但是,除非您确定,否则我强烈建议您不要这样做。原因是,有了这个,现在你的生产者和消费者之间有了更紧密的耦合。假设您想增强您的 API 并在您的生产者端添加一个新的必填字段。现在你必须同时管理你的生产者和消费者的发布。您可以要求所有消费者先升级,并在所有消费者升级后才升级您的生产者。您正在失去这种反序列化属性的灵活性。
  • 感谢您的建议。但我们只需要将它作为我们安全规范的一部分。

标签: java spring-boot rest validation jackson


【解决方案1】:

你可以使用@JsonIgnoreProperties来做到这一点。

@JsonIgnoreProperties(ignoreUnknown = true)
public class Account {

    @NotEmpty(message = "accountid is required")
    private String accountid;

    @NotEmpty(message = "name is required")
    private String name;

   //getters & setters

}

在 application.yml 中添加以下属性以在 spring-boot 最新版本中工作。

spring:
  jackson:
    deserialization:
      fail-on-unknown-properties: true

【讨论】:

  • 再次检查了我的代码。不工作。它进入服务层,请求正文中有未知字段。
  • 添加属性后尝试。
  • 在属性文件中添加上述属性后,它正在工作。谢谢。
猜你喜欢
  • 2020-11-25
  • 2015-06-13
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
  • 2011-11-11
  • 2021-09-08
相关资源
最近更新 更多