Spring Custom Converter异常抛出

时间:2018-06-07 14:44:53

标签: java spring spring-mvc spring-boot

我正在编写一个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'的字符串时会发生解析异常。

有任何帮助吗?

2 个答案:

答案 0 :(得分:1)

通过尝试同时转换数据&#34;来混合不同的问题。和#34;处理Web响应&#34;在同一个地方。一次做一件事并遵循标准做法,在这种情况下意味着抛出hook_form。然后,Spring将了解发生的情况并根据您的Web MVC配置采取适当的操作(例如将400状态代码返回给客户端)。如果要提供自定义错误处理,请让您的建议处理转换服务重新抛出的异常。

请注意,在这种特定情况下,使用ConversionFailedException已经可以使用此逻辑。

答案 1 :(得分:0)

建议使用标准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'