我最近尝试学习 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 响应,但这似乎没有发生。 这里缺少什么?
您可能使用旧版本的 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
。