SpringBoot + Java 17 @Valid не проверяет POJO

Недавно я пытался изучить Spring и Java 17, поскольку у меня есть опыт работы только с Dropwizard и Java 11, и я хотел бы выполнить проверку POJO в запросе POST или PUT.
Я столкнулся с несколькими примерами, но при локальном тестировании я, похоже, не смог выполнить проверку. Сначала я подумал, что это может быть проблема с записями, поэтому я вернулся к классу и до сих пор не могу его проверить. , есть какие-нибудь подсказки относительно того, в чем может быть проблема?

Мой контроллер:

@RestController
public class HelloWorldController {

//... other GET APIs

  @PostMapping("/userProfile")
  @ResponseStatus(HttpStatus.CREATED)
  public ResponseEntity<UserProfileClass> addUserProfile(@RequestBody @Valid UserProfileClass userProfile) {
    System.out.println("Inserting in the database: " + userProfile);
    return ResponseEntity.ok(userProfile);
  }

POJO (UserProfileClass):

public class UserProfileClass {

    @NotNull @NotBlank String name;
    @NotBlank @NotNull String address;
    //... getters and setters

pom.xml, содержащий валидаторы:

    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>2.0.1.Final</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>

Если я запускаю его локально и делаю POST на IntelliJ со следующим:

POST http://localhost:8080/userProfile
Content-Type: application/json

{
  "name": "some Name"
}

Я всегда получаю 200 со следующим кузовом:

HTTP/1.1 200 
Content-Type: application/json
Transfer-Encoding: chunked
Date: Sun, 18 Feb 2024 23:21:46 GMT
Keep-Alive: timeout=60
Connection: keep-alive

{
  "name": "some Name",
  "address": null
}

Как очевидно, @NotNull не должен допускать этого, я предполагаю, что в случае сбоя @Valid я получу своего рода ответ 4XX, но, похоже, этого не происходит. Чего здесь не хватает?

Какую версию Spring Boot вы используете?

Dimitri Mestdagh 19.02.2024 00:38

@DimitriMestdagh <версия>3.1.4</версия>

Dany 19.02.2024 00:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
955
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Проблема в том, что вы, скорее всего, полагаетесь на неправильную версию API проверки компонентов. Вы включаете v2 этого API, но с Spring Boot 3 вам следует полагаться на Jakarta EE 9, для которой требуется v3 API проверки компонентов.

Чтобы решить эту проблему, вам нужно удалить зависимость validation-api. Вместо этого вам не нужно ничего добавлять, поскольку spring-boot-starter-validation уже включает правильную зависимость API проверки (через hibernate-validator).

После удаления зависимости вам придется изменить импорт с javax.validation.* на jakarta.validation.*.

Спасибо. Это сработало. Пришлось пару раз обновить мой Maven, прежде чем он распознал Джакарту, но все сработало как часы, большое спасибо! Есть какой-нибудь совет о том, как я мог бы решить эту проблему самостоятельно? Я потратил пару дней и довольно много времени на просмотр разных конфигов

Dany 19.02.2024 00:49

@Dany Единственный совет, который я могу дать, — это понимать, что стартеры Spring Boot обычно включают все необходимые вам зависимости. Итак, как только вы это узнаете, вы должны смутиться, что вам пришлось включать эту дополнительную зависимость. Но без этой дополнительной зависимости ваш импорт не удастся, и если вы затем поищете в Google вопрос «почему импорт javax.validation не работает в весенней загрузке 3», вы найдете множество статей, рассказывающих вам то же самое, что и я.

Dimitri Mestdagh 19.02.2024 00:57

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