Недавно я пытался изучить 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, но, похоже, этого не происходит. Чего здесь не хватает?
@DimitriMestdagh <версия>3.1.4</версия>




Проблема в том, что вы, скорее всего, полагаетесь на неправильную версию 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 Единственный совет, который я могу дать, — это понимать, что стартеры Spring Boot обычно включают все необходимые вам зависимости. Итак, как только вы это узнаете, вы должны смутиться, что вам пришлось включать эту дополнительную зависимость. Но без этой дополнительной зависимости ваш импорт не удастся, и если вы затем поищете в Google вопрос «почему импорт javax.validation не работает в весенней загрузке 3», вы найдете множество статей, рассказывающих вам то же самое, что и я.
Какую версию Spring Boot вы используете?