Проверка Javax для List<String> выдает исключение

Я пытаюсь включить проверку @Pattern для строковых элементов внутри списка, используя проверку javax. Ниже приведен упрощенный пример:

public class ProgramRQDTO implements Serializable {

    private static final long serialVersionUID = -1L;

    @Size(min = 2, max= 5)
    private String lang;

    private List<@Pattern(regexp = "^[a-zA-Z_]+$") String> destinations;

    ...getters/setters

}

Этот DTO используется как тело запроса POST, в котором используется аннотация @Valid.

@POST
@Produces({ MediaType.APPLICATION_JSON })
public Response method(@Valid @RequestBody MyDTO requestDto) {

    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    Validator validator = factory.getValidator();
    Set<ConstraintViolation<MyDTO>> violations = validator.validate(requestDto);

    ...

}

Этот метод validator.validate(requestDto) выдает исключение.

javax.validation.ValidationException: HV000187: When using type annotation constraints on parameterized iterables or map @Valid must be used. Check com.example.MyDTO#destinations

Можно ли проверить список внутри DTO без создания класса-оболочки для этого списка? Есть ли что-то, что я делаю неправильно?

Любая помощь приветствуется.

Я пытался включить аннотацию @Valid в DTO в разных точках, но мне не удалось избавиться от этой ошибки.

ОБНОВЛЯТЬ:

Все следующие действия дают один и тот же результат:

@Действительный
частный список<@Pattern(regexp="^[a-zA-Z_]+$") String> пунктов назначения;

частный список<@Valid @Pattern(regexp="^[a-zA-Z_]+$") String> пунктов назначения;

@Действительный
частный список<@Valid@Pattern(regexp="^[a-zA-Z_]+$") String> пунктов назначения;

Здравствуйте, я бы просто следил за сообщением об ошибке и добавлял аннотацию @Valid к адресам полей в вашем DTO. Я предполагаю, что это было необходимо в более старых версиях проверки Java. До проверки фасоли Jakarta 3.O

Mar-Z 12.04.2023 11:25

Вы аннотировали destinations с помощью @Valid, как указано в сообщении?

Rob Spoor 12.04.2023 13:47

Привет, да, попробовал с @Valid перед List<String> и внутри List<@Valid ... String>. Но такое же исключение

Kain 13.04.2023 08:01

Вы пытались разместить аннотацию правила @Pattern над списком <String>?

Guy_g23 13.04.2023 08:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
160
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я бы просто следил за сообщением об ошибке и добавлял аннотацию @Valid в поле destinations в вашем DTO. Я предполагаю, что это было необходимо в более старых версиях проверки Java. До проверки фасоли Jakarta 3.O

Решение

Попробуй это:

public class ProgramRQDTO implements Serializable {

    @Valid
    private List<@Pattern(regexp = "^[a-zA-Z_]+$") String> destinations;

}

РЕДАКТИРОВАТЬ то, что я нашел в сети:

@Getter(onMethod = @__(@Valid))
@Setter(onParam = @__(@Valid))
@Valid
public class ProgramRQDTO implements Serializable {

    @Valid
    private List<@Pattern(regexp = "^[a-zA-Z_]+$") String> destinations;

}

РЕДАКТИРОВАТЬ 2

Я только что протестировал его с новейшими версиями Spring Boot Starters, и он работает без проблем. Нет необходимости в дополнительных аннотациях. Следующие зависимости сделали свое дело:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.0.5</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

Привет, я пытался включить аннотацию @Valid в DTO в разных точках, но мне не удалось избавиться от этой ошибки. Я пытался до List<String ...> и внутри List<@Valid ... String>

Kain 13.04.2023 08:02

Пожалуйста, проверьте мое редактирование. Похоже, это связано с Ломбоком.

Mar-Z 13.04.2023 09:09

Благодарю за ваш ответ. Проблема, как вы говорите, связана с ломбоком. К сожалению, я не могу использовать Spring в этом проекте, но это дает мне понять, где искать. Спасибо

Kain 13.04.2023 13:09

Другие вопросы по теме