java - 如何在 Spring Boot REST API 中启用 JSON/Jackson @RequestBody 的严格验证?

标签 java spring rest spring-boot jackson

如果 JSON 请求中指定了额外参数,如何抛出错误?例如,“xxx”不是有效参数,也不是 @RequestBody 对象中的有效参数。

$ curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" -d '{"apiKey": "'$APIKEY'", "email": "name@example.com", "xxx": "yyy"}' localhost:8080/api/v2/stats

我尝试将 @Validated 添加到界面,但没有帮助。

@RequestMapping(value = "/api/v2/stats", method = RequestMethod.POST, produces = "application/json")
public ResponseEntity<DataResponse> stats(Principal principal, @Validated @RequestBody ApiParams apiParams) throws ApiException;

我想启用“严格”模式,这样如果请求中存在额外的虚假参数,它将给出错误。我找不到办法做到这一点。我找到了确保有效参数确实存在的方法,但无法确保不存在额外的参数。

<小时/>
public class ApiParams extends Keyable {

    @ApiModelProperty(notes = "email of user", required = true)
    String email;
<小时/>
public abstract class Keyable {

    @ApiModelProperty(notes = "API key", required = true)
    @NotNull
    String apiKey;

Spring Boot 1.5.20

最佳答案

在幕后,Spring 使用 Jackson 库将 POJO 序列化/反序列化为 JSON,反之亦然。默认情况下,框架用于执行此任务的 ObjectMapperFAIL_ON_UNKNOWN_PROPERTIES 设置为 false

您可以通过在 application.properties 中设置以下配置值来全局启用此功能。

spring.jackson.deserialization.fail-on-unknown-properties=true

或者,如果使用 YAML 格式,请将以下内容添加到您的 application.yaml(或 .yml)文件中):

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

随后,如果您想忽略特定 POJO 的未知属性,可以在该 POJO 类中使用注释 @JsonIgnoreProperties(ignoreUnknown=true)

<小时/>

不过,这可能意味着 future 需要大量的手动工作。从技术上讲,忽略这些意外数据并不违反任何软件开发原则。在某些情况下,您的 @Controller 前面可能有一个过滤器或 servlet 正在执行您不知道的其他操作,而这些操作需要这些额外的数据。看起来值得付出努力吗?

关于java - 如何在 Spring Boot REST API 中启用 JSON/Jackson @RequestBody 的严格验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56052262/

相关文章:

java - Spring选择了存储库实现,它甚至没有实现存储库接口(interface)

java - MULTIPART_FORM_DATA : No injection source found for a parameter of type public javax. ws.rs.core.Response

java - 如何获取上一个URL页面?引荐来源网址不起作用

java - 在一个表单中有多个提交按钮并确定哪个在 Controller 中被按下

java - 如何在 spring-integration-kafka 2.1.0.RELEASE 和 Kafka 0.10.0 中为不同的主题配置不同的生产者?

node.js - express 服务器在 5 个 POST 后没有响应

javascript - 自描述 RESTful api

java - 应用程序在 Droid X 上崩溃

java - 在 android.support.v7.util.SortedList 上进行二进制搜索

java - 函数参数错误 - JComboBox 中的 AutoComplete