Spring Custom Converter Исключение броска - PullRequest
0 голосов
/ 07 июня 2018

Я пишу специальный конвертер 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 голосов
/ 07 июня 2018

Рекомендуется использовать стандартную org.springframework.format.annotation.DateTimeFormat аннотацию для преобразования в java.time типов и поймать DateTimeParseException в рекомендации.

Вы определенно хотите избегать смешения старых SimpleDateFormat с LocalDate.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'
0 голосов
/ 07 июня 2018

Вы смешиваете различные проблемы, пытаясь поместить и «конвертировать данные», и «обрабатывать веб-ответы» в одном месте.Делайте одну вещь за раз и следуйте стандартным практикам, что в данном случае означает бросок ConversionFailedException.Затем Spring поймет, что произошло, и предпримет соответствующие действия на основе вашей конфигурации Web MVC (например, вернет код состояния 400 клиенту).Если вы хотите обеспечить пользовательскую обработку ошибок, попросите ваш совет обработать исключение, которое преобразует служба преобразования.

Обратите внимание, что в данном конкретном случае эта логика уже доступна с помощью @DateTimeFormat.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...