基本上,我尝试使用@exceptionhandler来捕获methodargumentnotvalidexception约束来验证rest控制器的@requestbody的输入。
@PostMapping(value = "/createbaseline")
public ResponseEntity<?> createBaseline(@Valid @RequestPart Baseline baseline){
//...
return ResponseEntity.ok("...");
}
在此之前,当jackson无法将字符串解析为日期时抛出invalidformatexception,从而阻止@exceptionhandler验证剩余的输入。这里是我的@exceptionhandler方法,我想用它来验证输入。
@ExceptionHandler(MethodArgumentNotValidException.class)
protected final ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex){
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getAllErrors().forEach(error -> {
String[] mapping = error.getDefaultMessage().split(":");
errors.put(mapping[0], mapping[1]);
});
return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
}
我考虑过只将对象的date属性更改为字符串,但我知道这不符合最佳实践。之所以要使用handlemethodargumentnotvalid,是因为我在对象中的字段上有自定义约束注解,这些注解指定了一个键,我可以通过methodargumentnotvalidexception.getbindingresult()访问该键,如下所示:
@RequiredFieldConstraint(key = "label")
private String label;
然后,客户机可以使用这些键来确定哪个输入字段将显示错误。如果我使用下面的方法捕获invalidformatexception,那么我就不能访问由字段注解指定的键。
@ExceptionHandler(value = {InvalidFormatException.class})
protected ResponseEntity<Object> handleException(Exception e){
//can't access annotation keys in this method body
return ResponseEntity.badRequest().body("bad");
}
我需要能够验证@responsebody中发送的所有输入,以便将适当的错误消息发送回客户端,但我仍然希望利用将@requestbody直接反序列化到对象中。有人对如何处理或解决这个问题有想法吗?
1条答案
按热度按时间wtlkbnrh1#
为此,我找到了一个解决方法,实现了一个自定义的日期反序列化程序,这样它可以捕获invalidformatexception,但仍然返回一个新的date(),其中包含.settime(-1),我可以在handlemethodargumentnotvalid方法中与所有其他输入一起检查它。