SpringBoot @DateTimeFormat 和通过 MessageSource 自定义错误消息

问题描述 投票:0回答:0

我试图避免在 Spring 无法使用 @DateTimeFormat 转换日期时将此类错误返回给客户端

无法将“java.lang.String”类型的属性值转换为 属性“myDate”需要类型“java.time.LocalDateTime”;嵌套 例外是 org.springframework.core.convert.ConversionFailedException: 失败 从类型 [java.lang.String] 转换为类型 [@org.springframework.format.annotation.DateTimeFormat java.time.LocalDateTime] 的值 '2023-01-01 00:00';嵌套 异常是 java.lang.IllegalArgumentException:解析尝试失败 价值 [2023-01-01 00:00]

这是我试过的。

public class MyDTO {

  @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  private LocalDateTime myDate;
}

控制器

@GetMapping("/hello")
public String test(@ParameterObject MyDTO myDTO) {
    return "hello";
}

在我添加的

messages.properties
文件中(添加不同的组合只是为了测试)

typeMismatch.java.time.LocalDateTime=Date is not correctly formatted
typeMismatch=Date is not correctly formatted

我也有一个控制器的建议

@ControllerAdvice
public class MyControllerAdvice {

@ExceptionHandler(BindException.class)
  public ResponseEntity<....> handleBindException(BindException e) {
   // I break point in here to see what's inside e and verify my custom error code is in there somewhere
  }
}

如果我用错误的日期调用控制器,例如

2023-01-01 00:00
,Spring 会正确抛出包含原始异常详细信息和以下错误的 BindException
codes

typeMismatch.java.time.LocalDateTime
typeMismatch.MyDTO.myDate
typeMismatch.myDate
typeMismatch

但是我的自定义错误消息无处可见。获取它的唯一方法是手动

@Autowired MessageSource messageSource
(由SpringBoot使用
ResourceBundleMessageSource
实现自动创建并调用
messageSource.getMessage(code, args, locale)
messageSource.get((MessageSourceResolvable) e.getBindingResult().getFieldError().getArguments()[0], locale)

现在通过阅读有关该主题的各种 SO,人们似乎说只需在

messages.properties
中添加自定义错误消息,它应该神奇地将这些错误消息添加到异常中的某处,但我在春天的任何地方都看不到这种代码代码库(DefaultMessageCodesResolver?DefaultBindingErrorProcessor?
org.springframework.format.datetime.standard.TemporalAccessParser where the actual 
DateTimeParseException
 is thrown

我是不是读错了这些答案,我们在

messages.properties
中添加的任何内容都需要使用控制器建议中的
messageSource.getMessage(code, args, locale)
手动获取?

spring spring-boot datetime-format java-time custom-errors
© www.soinside.com 2019 - 2024. All rights reserved.