我有一个在端点上侦听的Sping Boot 服务器。我接受@RequestBody作为对象:
@RequestBody
class Body { private String name; }
我希望它接受以下请求:
{ "name": "some_name" }
但是,它也接受:
{ "name": "some_name", "dummy key":"dummy key value" }
在这种情况下,我希望它抛出错误。我怎么才能做到呢?
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); } }
xuo3flqw2#
如果您希望控制器在RequestBody与您期望的不匹配时返回错误**,则只需将以下内容添加到application.properties:
RequestBody
application.properties
这将在格式错误的请求上返回默认的400响应。
@Valid
向控制器添加@Valid注解会执行约束验证,并且只有在以下情况下才会失败,例如,您将字段标记为最大值1,但请求试图将其设置为2。根据文档:
1
2
为验证级联标记属性、方法参数或方法返回类型。当验证属性、方法参数或方法返回类型时,将验证在对象及其属性上定义的约束。但是因为你没有使用jakarta.validation提供的任何工具,所以这个注解对你的代码没有任何影响。
jakarta.validation
2条答案
按热度按时间iklwldmw1#
您可以在保存时在控制器中执行此操作:
当Spring找到一个用@Valid标注的参数时,它会自动验证参数,如果验证失败,就会抛出一个异常。
或者你也可以这样做:
在application.properties
这有助于我们使反序列化在未知属性上失败,并抛出一个异常,我们可以使用handleHttpMessageNotReadable处理该异常
创建控制器通知以处理异常
xuo3flqw2#
TL;DR;
如果您希望控制器在
RequestBody
与您期望的不匹配时返回错误**,则只需将以下内容添加到application.properties
:这将在格式错误的请求上返回默认的400响应。
@Valid
注解向控制器添加
@Valid
注解会执行约束验证,并且只有在以下情况下才会失败,例如,您将字段标记为最大值1
,但请求试图将其设置为2
。根据文档:为验证级联标记属性、方法参数或方法返回类型。当验证属性、方法参数或方法返回类型时,将验证在对象及其属性上定义的约束。
但是因为你没有使用
jakarta.validation
提供的任何工具,所以这个注解对你的代码没有任何影响。