Я пытаюсь включить проверку @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> пунктов назначения;
Вы аннотировали destinations
с помощью @Valid
, как указано в сообщении?
Привет, да, попробовал с @Valid перед List<String> и внутри List<@Valid ... String>. Но такое же исключение
Вы пытались разместить аннотацию правила @Pattern над списком <String>?
Я бы просто следил за сообщением об ошибке и добавлял аннотацию @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>
Пожалуйста, проверьте мое редактирование. Похоже, это связано с Ломбоком.
Благодарю за ваш ответ. Проблема, как вы говорите, связана с ломбоком. К сожалению, я не могу использовать Spring в этом проекте, но это дает мне понять, где искать. Спасибо
Здравствуйте, я бы просто следил за сообщением об ошибке и добавлял аннотацию @Valid к адресам полей в вашем DTO. Я предполагаю, что это было необходимо в более старых версиях проверки Java. До проверки фасоли Jakarta 3.O