@n199a
Java

Почему не срабатывает Hibernate валидация?

Как известно, в контроллере при передаче в запросе имени аргумента, который должен быть Enum'ом, существует функционал по автоматическому преобразованию данного аргумента в одно из значений Enum'a.

Вот я зарегистрировал в контроллере FormatterRegistry:

@Override
public void addFormatters(FormatterRegistry registry) {
    registry.addConverter(new StringToColumnNameConverter());
}


Вот как выглядит StringToColumnNameConverterвнутри с Hibernate валидацией (@NotBlank):

public class StringToColumnNameConverter implements Converter<String, ColumnName> {
    @Override
    public ColumnName convert(@NotBlank(message = PropertyKey.VALIDATION_DATABASE_COLUMN_NAME_NOT_BLANK) String source) {
        return ColumnName.valueOf(source.toUpperCase());
    }
}


Идем дальше. В контроллере вызывается метод, который принимает имя столбца (columnName):

@GetMapping(params = ParameterName.SORT_BY)
    public Set<GiftCertificateDto> findAllSorted(@RequestParam(value = ParameterName.SORT_BY)
                                                 @NotEmpty(message = PropertyKey.VALIDATION_GIFT_CERTIFICATE_COLUMN_MANE_NOT_EMPTY)
                                                         Set<ColumnName> columnNames) {

        return service.findAllSorted(columnNames);
}


Первая Hibernate аннотация
@NotEmpty(message = PropertyKey.VALIDATION_GIFT_CERTIFICATE_COLUMN_MANE_NOT_EMPTY)
отрабатывает на ура. Но если я передам строку, содержащую одни пробелы вида , то вторая аннотация @NotBlank внтури StringToColumnNameConverterпочему-то не отрабатывает своё дело. Почему?

Что я пробовал:
- аннотировать @Validated класс StringToColumnNameConverter;
- аннотировать @Validated метод convert(...) класса StringToColumnNameConverter;
- в StringToColumnNameConverter добавлял аннотацию @Valid:
public class StringToColumnNameConverter implements Converter<@Valid String, ColumnName>

- в контроллере внутри Set вставлять аннотацию @Valid:
@GetMapping(params = ParameterName.SORT_BY)
    public Set<GiftCertificateDto> findAllSorted(@RequestParam(value = ParameterName.SORT_BY)
                                                 @NotEmpty(message = PropertyKey.VALIDATION_GIFT_CERTIFICATE_COLUMN_MANE_NOT_EMPTY)
                                                         Set<@Valid ColumnName> columnNames) {

        return service.findAllSorted(columnNames);
    }


Контроллер аннотирован @Validated.

Для справки: @NotBlank - The annotated element must not be null and must contain at least one non-whitespace character. Accepts CharSequence.
  • Вопрос задан
  • 177 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы