我有一个侦听端点的 Spring Boot 服务器。我接受
@RequestBody
作为对象:
class Body {
private String name;
}
我希望它接受如下请求:
{
"name": "some_name"
}
但是,它也接受:
{
"name": "some_name",
"dummy key":"dummy key value"
}
在这种情况下我希望它抛出错误。我怎样才能实现它?
如果您希望控制器返回错误当
RequestBody
与您期望的不匹配时,将其添加到您的application.properties
就足够了:
spring.jackson.deserialization.fail-on-unknown-properties=true
这将对格式错误的请求返回默认的 400 响应。
@Valid
注释将
@Valid
注释添加到控制器会执行约束验证,并且仅在以下情况下才会失败:例如,您将字段标记为最大值 1
但请求尝试将其设置为 2
。根据文档:
标记用于验证级联的属性、方法参数或方法返回类型。当验证属性、方法参数或方法返回类型时,对对象及其属性定义的约束也将被验证。
但是由于您没有使用
jakarta.validation
提供的任何工具,因此此注释对您的代码没有影响。
您可以在保存时在控制器中执行此操作:
@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);
}
}