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

Chl*_*loe 3 java rest spring jackson spring-boot

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

$ curl -X POST -H "Content-Type: application/json" -H "Authorization: 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;
Run Code Online (Sandbox Code Playgroud)

我想启用“严格”模式,以便在请求中存在额外的虚假参数时会出错。我找不到办法做到这一点。我找到了确保有效参数确实存在的方法,但无法确保没有额外的参数。


public class ApiParams extends Keyable {

    @ApiModelProperty(notes = "email of user", required = true)
    String email;
Run Code Online (Sandbox Code Playgroud)
public abstract class Keyable {

    @ApiModelProperty(notes = "API key", required = true)
    @NotNull
    String apiKey;
Run Code Online (Sandbox Code Playgroud)

春季启动 1.5.20

Mr.*_*mes 10

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

您可以开启此功能GLOBALLY通过设置在下面的配置价值application.properties

spring.jackson.deserialization.fail-on-unknown-properties=true
Run Code Online (Sandbox Code Playgroud)

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

spring.jackson.deserialization.fail-on-unknown-properties=true
Run Code Online (Sandbox Code Playgroud)

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


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

  • 也许对于生产来说不太有用,但对于开发来说这可能非常有用。感谢您的回答。 (3认同)