一尘不染

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

spring-boot

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

$ curl -X POST -H“内容类型:application / json” -H“授权:Bearer $ TOKEN” -d’{“
apiKey”:“’$ APIKEY’”,“ email”:“ name@example.com “, ” xxx“:” yyy“
}’本地主机: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靴1.5.20


阅读 508

收藏
2020-05-30

共1个答案

一尘不染

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

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

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

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

尽管如此,这仍是大量的手工工作。从技术上讲,忽略那些意外的数据不会违反任何软件开发原则。在@Controller某些情况下,可能会有一个过滤器或servlet摆在您做其他事情的前面,而您不清楚这些事情需要这些额外的数据。值得付出努力吗?

2020-05-30