RestController 中的注解 @Valid 始终返回状态代码 200

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

我在网上关注了多个帖子,例如 https://www.javatpoint.com/restful-web-services-validations https://reflectoring.io/bean-validation-with-spring-boot/ 还有更多。

到处都写到,只需在@RequestBody前面添加@Valid即可检查输入的验证。但对我来说,它总是返回状态代码 200,尽管使用 JUnit 测试用例我能够验证所有限制。

我还关注了诸如带有注释的Spring Boot Validations之类的帖子 并添加 BindingResult 作为第二个参数,行为仍然相同,并且 BindingResult 对象显示 0 错误。

请在下面找到所有详细信息:-

DTO 类:

package practice.corejava.validators.dto;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserData {

    @NotBlank(message = "Name should not be blank")
    private String name;

    @NotNull(message = "Age should not be null")
    @Positive(message = "Age should be positive")
    private Integer age;

}

控制器类:(始终通过 Postman 返回 201)

package practice.corejava.validators.controller;

import practice.corejava.validators.dto.UserData;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;

import jakarta.validation.Valid;

import java.net.URI;

@RestController
@RequestMapping("api/v1/validations")
public class ValidationsController {

    @PostMapping(value = "/user-data", consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<UserData> createUserData(@Valid @RequestBody UserData userData) {
        URI location = ServletUriComponentsBuilder.fromCurrentRequest().path("/{name}").buildAndExpand(userData.getName()).toUri();
        return ResponseEntity.created(location).build();
    }

}

JUnit 测试类:(测试用例成功)

package practice.corejava.validators.dto;

import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

import jakarta.validation.ConstraintViolation;
import jakarta.validation.Validation;
import jakarta.validation.Validator;
import jakarta.validation.ValidatorFactory;
import java.util.Set;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class UserDataTest {

    private static Validator validator;

    @BeforeAll
    public static void setUp() {
        try (ValidatorFactory factory = Validation.buildDefaultValidatorFactory()) {
            validator = factory.getValidator();
        }
    }

    @Test
    void all_validation_success() {
        UserData userData = new UserData("SomeName", 30);
        Set<ConstraintViolation<UserData>> constraintViolations = validator.validate(userData);
        assertEquals(0, constraintViolations.size());
    }

    @Test
    void name_blank() {
        UserData userData = new UserData("", 30);
        Set<ConstraintViolation<UserData>> constraintViolations = validator.validate(userData);
        assertEquals(1, constraintViolations.size());
        assertEquals("Name should not be blank", constraintViolations.iterator().next().getMessage());
    }

}

Postman 请求正文:预计为 400,但状态代码为 201

{
    "name" : null,
    "age" : 30
}

有人可以帮忙回答吗,因为由于代表点较少,我无法对任何现有帖子发表评论或投票。

请在下面找到“依赖项和版本”详细信息:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.1.3</version>
    <relativePath/>
</parent>

<properties>
    <java.version>17</java.version>
</properties>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>jakarta.validation</groupId>
    <artifactId>jakarta.validation-api</artifactId>
    <version>3.0.2</version>
</dependency>
spring-boot validation annotations spring-restcontroller
1个回答
0
投票

正如 M. Deinum 在评论中所建议的,我使用的依赖项与 Spring boot 3.x 不兼容。因此,响应没有按预期进行。使用建议的更改进行更新后,现在它可以正常工作了。非常感谢您的建议和时间@M。迪努姆

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