java 如何在传入的JSON请求体中不接受其他字段

qgzx9mmu  于 2023-05-15  发布在  Java
关注(0)|答案(2)|浏览(180)

我有一个在端点上侦听的Sping Boot 服务器。我接受@RequestBody作为对象:

class Body {
   private String name;
}

我希望它接受以下请求:

{
   "name": "some_name"
}

但是,它也接受:

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

在这种情况下,我希望它抛出错误。我怎么才能做到呢?

iklwldmw

iklwldmw1#

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

@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);
    }

}
xuo3flqw

xuo3flqw2#

TL;DR;

如果您希望控制器在RequestBody与您期望的不匹配时返回错误**,则只需将以下内容添加到application.properties

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

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

@Valid注解

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

为验证级联标记属性、方法参数或方法返回类型。当验证属性、方法参数或方法返回类型时,将验证在对象及其属性上定义的约束。
但是因为你没有使用jakarta.validation提供的任何工具,所以这个注解对你的代码没有任何影响

相关问题