如何不接受传入 JSON 请求正文中的附加字段

问题描述 投票:0回答:2

我有一个侦听端点的 Spring Boot 服务器。我接受

@RequestBody
作为对象:

class Body {
   private String name;
}

我希望它接受如下请求:

{
   "name": "some_name"
}

但是,它也接受:

{
   "name": "some_name",
   "dummy key":"dummy key value"
}

在这种情况下我希望它抛出错误。我怎样才能实现它?

java json spring model-view-controller
2个回答
2
投票

TL;博士;

如果您希望控制器返回错误

RequestBody
与您期望的不匹配时,将其添加到您的
application.properties
就足够了:

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

这将对格式错误的请求返回默认的 400 响应。

@Valid
注释

@Valid
注释添加到控制器会执行约束验证,并且仅在以下情况下才会失败:例如,您将字段标记为最大值
1
但请求尝试将其设置为
2 
。根据文档:

标记用于验证级联的属性、方法参数或方法返回类型。当验证属性、方法参数或方法返回类型时,对对象及其属性定义的约束也将被验证。

但是由于您没有使用

jakarta.validation
提供的任何工具,因此此注释对您的代码没有影响


2
投票

您可以在保存时在控制器中执行此操作:

@PostMapping("/add")
public ResponseEntity<Body> registerUser(@Valid @RequestBody Body saveUser) {
    Body createdUser = userService.save(saveUser);
    
    return new ResponseEntity<>(createdUser, HttpStatus.CREATED);
}

当Spring发现带有@Valid注解的参数时,它会自动验证该参数,如果验证失败则抛出异常。

或者您可以将其添加到

application.properties

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

这有助于我们使未知属性的反序列化失败并抛出异常,我们可以使用

handleHttpMessageNotReadable
来处理该异常。

创建控制器建议来处理异常:

@ControllerAdvice
public class CustomExceptionHandler extends ResponseEntityExceptionHandler {
    @Override
    protected ResponseEntity<Object> handleHttpMessageNotReadable(
            HttpMessageNotReadableException ex, HttpHeaders headers,
            HttpStatus status, WebRequest request) {
        return new ResponseEntity("Your Response Object", 
                HttpStatus.INTERNAL_SERVER_ERROR);
    } 
}
© www.soinside.com 2019 - 2024. All rights reserved.