Микронат 4: валидация не работает, DTO не проходит проверку

Вопросы и ответы

Я настроил валидацию в 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 может быть вызвана несколькими причинами. Давайте пройдемся по некоторым из них и убедимся, что все настройки выполнены правильно.

  1. Проверьте зависимости: Убедитесь, что в вашем файле pom.xml правильно указаны все необходимые зависимости. У вас уже есть зависимости для micronaut-jackson-databind и micronaut-validation, но вам также потребуется убедиться, что вы используете правильные версии и все они совместимы.

  2. Добавьте аннотацию @Valid: Вы уже используете аннотацию @Valid в вашем контроллере, что правильно. Эта аннотация необходима для активации валидации при передаче DTO.

  3. Проверьте, настроен ли Validator: Убедитесь, что в вашем приложении инициализируется Validator. В Micronaut вы должны убедиться, что валидация активна. Это можно сделать с помощью конфигурации приложения. Убедитесь, что у вас есть настройки для валидации:

    micronaut:
      validation:
        enabled: true
  4. Проверьте, действительно ли DTO передан в контроллер: Чтобы удостовериться, что DTO действительно передается в контроллер, вы можете добавить временное логирование или отладку, чтобы посмотреть, какие данные приходят в tripCreateRequest. Это поможет понять, правильно ли обрабатываются входные данные и не являются ли они null.

  5. Проверьте классы DTO и зависимости: Убедитесь, что LocationDto также имеет правильные аннотации для валидации (например, @NotNull для полей), если вы ожидаете, что его поля также будут валидироваться.

  6. Обновите процессоры аннотаций: Проверьте, что все процессоры аннотаций указаны правильно в вашем pom.xml. Вы правильно добавили micronaut-validation-processor. Убедитесь, что вы используете актуальные версии, которые совместимы с вашей версией Micronaut.

  7. Проверьте конфигурацию 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!

Оцените материал
Добавить комментарий

Капча загружается...