忽略invalidformatexception以将@exceptionhandler用于@valid@requestbody

qgelzfjb  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(517)

基本上,我尝试使用@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直接反序列化到对象中。有人对如何处理或解决这个问题有想法吗?

wtlkbnrh

wtlkbnrh1#

为此,我找到了一个解决方法,实现了一个自定义的日期反序列化程序,这样它可以捕获invalidformatexception,但仍然返回一个新的date(),其中包含.settime(-1),我可以在handlemethodargumentnotvalid方法中与所有其他输入一起检查它。

相关问题