Аннотации @Valid и @NotNull не улавливают пустое поле в запросе post

#java #spring #spring-boot

Вопрос:

Привет, у меня есть одно поле запроса на публикацию JSON.

 import lombok.*;
import javax.validation.constraints.NotNull;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class WebURLRequest {

    @NotNull(message = "URL can not be null")
    private String url;
}
 

В контроллере я аннотировал как @Valid и @RequestBody , но когда я отправил запрос на публикацию, подобный этому, я, кроме этого, вернул содержательное сообщение, как я записываю в DTO.
Вместо этого сообщения, поскольку URL-адрес не найден в теле запроса, уровень обслуживания выдает NullPointerException .
Я знаю, что могу справиться с этим на уровне обслуживания или в контроллере с проверкой на нуль, но разве это не должно обрабатываться @NotNull аннотацией?

Контроллер

 import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

@PostMapping("/to-deep")
    public ResponseEntity<DeepResponse> toDeep(@Valid @RequestBody WebURLRequest webURLRequest) {
        return new ResponseEntity<>(converterService.toDeep(webURLRequest), HttpStatus.OK);
    }
 

Тело запроса, которое я отправил

 {
"somethingElse":""
}
 

решение:

Я добавил эту зависимость в файл pom

 <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
 

Комментарии:

1. пустота-это нечто иное, чем null . Используйте @NotEmpty вместо @NotNull .

2. в теле запроса нет поля «url». Разве это не означает, что URL-адрес равен нулю?

3. Упс, только что увидел пустое поле. Есть ли у вас фактическая реализация валидатора в пути к классам? Или вы только добавили javax.validation-api ? Если это так, добавьте hibernate-validator также зависимость (используйте версию 6, а не версию 7, так как это JakartaEE, а не JavaEE). Или при использовании Spring Boot используйте spring-boot-starter-validation , чтобы получить все это сразу.

4. @erondem добавьте свое решение в качестве ответа и примите его, чтобы другие могли извлечь из него пользу 😉 Спасибо!

5. для строки используйте @NotEmpty вместо NotNull

Ответ №1:

Спасибо @M. Deinum Я добавил эту зависимость в файл pom, и это решает мою проблему.

 <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-validation</artifactId>
</dependency>