Spring 自定义转换器 引发异常



我正在编写一个 Spring 自定义转换器,它将String转换为LocalDate

@Component
public class StringToLocalDateConverter implements Converter<String, LocalDate> {
private static final String ISO_DATE_FORMAT = "yyyy-MM-dd";
@Override
public LocalDate convert(String s) {
try {
new SimpleDateFormat(ISO_DATE_FORMAT).parse(s);
} catch (ParseException e) {
throw new BadRequestException();
}
return LocalDate.parse(s);
}
}

我希望转换器检查字符串日期是否以格式"yyyy-MM-dd"提供,如果没有抛出BadRequestException这是我的自定义@ControllerAdvice处理的自定义异常。

问题是永远不会从此方法中抛出异常,尽管当提供格式不正确的字符串时会发生解析异常'yyyy-MM-dd'

有什么帮助吗?

您尝试将"转换数据"和"处理 Web 响应"放在同一个位置,从而混合了不同的关注点。一次做一件事并遵循标准做法,在这种情况下,这意味着扔ConversionFailedException.然后,Spring 将了解发生了什么,并根据您的 Web MVC 配置采取适当的操作(例如向客户端返回 400 状态代码(。如果要提供自定义错误处理,请让建议处理转换服务重新引发的异常。

请注意,在此特定情况下,此逻辑已通过使用@DateTimeFormat可用。

建议使用标准org.springframework.format.annotation.DateTimeFormat注释转换为java.time类型,并在建议中捕获DateTimeParseException

您绝对要避免将旧SimpleDateFormatLocalDate.parse()混淆。 默认情况下,SimpleDateFormat是宽松的,因此它会像2018-02-30一样解析无效日期,但LocalDate.parse()不会。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(sdf.parse("2018-02-30")); // Fri Mar 02 00:00:00 GMT 2018
LocalDate.parse("2018-02-30"); // java.time.DateTimeException: Invalid date 'FEBRUARY 30'

最新更新