Я настроил валидацию в Micronaut 4.6.1, и она не работает для меня. DTO не проходит валидацию. Запрос проходит в контроллер, как будто аннотации валидации не существуют.
DTO (валидация, что свойства не равны null):
@Data
@AllArgsConstructor
@Introspected
public class TripCreateRequest {
@NotNull
private LocationDto start;
@NotNull
private LocationDto destination;
}
Контроллер (эндпоинт создания):
@Post
TripCreateResponse createOne(@Body @Valid TripCreateRequest tripCreateRequest) {
Trip trip = new Trip(
new Location(tripCreateRequest.getStart().getLatitude(), tripCreateRequest.getStart().getLongitude()),
new Location(tripCreateRequest.getDestination().getLatitude(), tripCreateRequest.getDestination().getLongitude())
);
trip = this.tripService.createOne(trip);
return TripCreateResponse.from(trip);
}
зависимости (я использую Jackson вместе с валидацией):
<dependency>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-jackson-databind</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.micronaut.validation</groupId>
<artifactId>micronaut-validation</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<scope>compile</scope>
</dependency>
сборка (процессоры аннотаций):
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<!-- Уберите комментарий, чтобы включить инкрементальную компиляцию -->
<!-- <useIncrementalCompilation>false</useIncrementalCompilation> -->
<annotationProcessorPaths combine.children="append">
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-http-validation</artifactId>
<version>${micronaut.core.version}</version>
</path>
<path>
<groupId>io.micronaut.validation</groupId>
<artifactId>micronaut-validation-processor</artifactId>
<version>${micronaut.validation.version}</version>
<exclusions>
<exclusion>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-inject</artifactId>
</exclusion>
</exclusions>
</path>
</annotationProcessorPaths>
<compilerArgs>
<arg>-Amicronaut.processing.group=com.example</arg>
<arg>-Amicronaut.processing.module=demo-m2</arg>
</compilerArgs>
</configuration>
</plugin>
Что я делаю не так? Код ведет себя так, как будто аннотации валидации не существуют.
Попытка использовать Serde вместо Jackson тоже не сработала.
Ответ
В вашей ситуации проблема с валидацией DTO в Micronaut 4.6.1 может быть вызвана несколькими причинами. Давайте пройдемся по некоторым из них и убедимся, что все настройки выполнены правильно.
-
Проверьте зависимости: Убедитесь, что в вашем файле
pom.xml
правильно указаны все необходимые зависимости. У вас уже есть зависимости дляmicronaut-jackson-databind
иmicronaut-validation
, но вам также потребуется убедиться, что вы используете правильные версии и все они совместимы. -
Добавьте аннотацию
@Valid
: Вы уже используете аннотацию@Valid
в вашем контроллере, что правильно. Эта аннотация необходима для активации валидации при передаче DTO. -
Проверьте, настроен ли
Validator
: Убедитесь, что в вашем приложении инициализируетсяValidator
. В Micronaut вы должны убедиться, что валидация активна. Это можно сделать с помощью конфигурации приложения. Убедитесь, что у вас есть настройки для валидации:micronaut: validation: enabled: true
-
Проверьте, действительно ли DTO передан в контроллер: Чтобы удостовериться, что DTO действительно передается в контроллер, вы можете добавить временное логирование или отладку, чтобы посмотреть, какие данные приходят в
tripCreateRequest
. Это поможет понять, правильно ли обрабатываются входные данные и не являются ли ониnull
. -
Проверьте классы DTO и зависимости: Убедитесь, что
LocationDto
также имеет правильные аннотации для валидации (например,@NotNull
для полей), если вы ожидаете, что его поля также будут валидироваться. -
Обновите процессоры аннотаций: Проверьте, что все процессоры аннотаций указаны правильно в вашем
pom.xml
. Вы правильно добавилиmicronaut-validation-processor
. Убедитесь, что вы используете актуальные версии, которые совместимы с вашей версией Micronaut. -
Проверьте конфигурацию Maven: Убедитесь, что вы используете правильную конфигурацию для
maven-compiler-plugin
. Вот пример настройки:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>17</source> <!-- Например, если вы используете Java 17 --> <target>17</target> <annotationProcessorPaths> <path> <groupId>io.micronaut</groupId> <artifactId>micronaut-validation-processor</artifactId> <version>${micronaut.validation.version}</version> </path> </annotationProcessorPaths> </configuration> </plugin>
Если после всех этих проверок проблема все еще не решена, попробуйте создать минимальный пример проекта с простой структурой, чтобы определить, не конфликтует ли что-то в вашем основном проекте.
Надеюсь, это поможет вам решить вашу проблему с валидацией в Micronaut!