SpringBoot + Java 17 @Valid 不验证 POJO

问题描述 投票:0回答:1

我最近尝试学习 Spring 和 Java 17,因为我只有 Dropwizard 和 Java 11 的经验,并且我想在 POST 或 PUT 请求中对 POJO 进行验证。
我遇到了几个例子,但是本地测试,我似乎无法真正运行到验证,起初我认为这可能是一个记录问题,所以我又回到了类,但我仍然无法验证它,有任何关于问题可能是什么的线索吗?

我的控制器:

@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(用户配置文件类):

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>

如果我在本地运行它,并使用以下内容在 IntelliJ 上执行 POST:

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 响应,但这似乎没有发生。 这里缺少什么?

java spring-boot validation pojo
1个回答
0
投票

您可能使用旧版本的 Bean 验证 API。对于 Spring Boot 3,您应该使用 Jakarta EE 9,而不是任何旧版本。

这意味着您不应该依赖

javax.validation:validation-api:2.0.1.Final
,而应该依赖
jakarta.validation:jakarta.validation-api:3.0.0
或更高版本。问题是,您甚至不需要首先包含依赖项,因为
spring-boot-starter-validation
已经包含它(通过
hibernate-validator
)。

因此,要解决此问题,请首先删除

validation-api
依赖项,然后将导入从
javax.validation
更改为
jakarta.validation

© www.soinside.com 2019 - 2024. All rights reserved.