我试图避免在 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)
手动获取?