Spring Boot 请求正文验证不起作用

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

谁能告诉我这段代码中缺少什么? Spring Boot 3.2.3 并且该部门已就位:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
@RestController
@Validated
public class TestController {

    @PostMapping("/test")
    public ResponseEntity<?> test(@Valid @RequestBody Test test) {

        System.out.println(test);

        return ResponseEntity.ok().build();
    }
}

@Valid
public class Test {

    @Valid
    @NotNull
    private String text;

    @Valid
    @NotNull
    public String getText() {
        return text;
    }

    @Valid
    @NotNull
    public void setText(@Valid @NotNull final String text) {
        this.text = text;
    }
}

我尝试了十几种带有注释的变体,但仍然不起作用。 POST 此有效负载会返回 200 OK:

{

}

or this

{
  "test": {
    
  }
}

or this 

{
  "test": {
    "text": null
  }
}

控制台输出:

null

spring-boot spring-mvc
1个回答
0
投票

重写测试类如下。

import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Size;

public class Test {

    @NotEmpty
    @Size(min = 2, message = "should have at least 2 characters")
    private String text;

    public Test() {
    }

    public Test(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

}

然后自定义验证响应可以执行以下操作。

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

import java.util.HashMap;
import java.util.Map;

@ControllerAdvice
public class ValidationHandler extends ResponseEntityExceptionHandler {

    @Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getAllErrors().forEach((error) -> {

            String fieldName = ((FieldError) error).getField();
            String message = error.getDefaultMessage();
            errors.put(fieldName, message);
        });
        return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
    }
}

使用这些输入进行测试:

{
}

{
    "text":null
}

{
    "text":""
}

回应

{
    "text": "must not be empty"
}
© www.soinside.com 2019 - 2024. All rights reserved.