谁能告诉我这段代码中缺少什么? 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
重写测试类如下。
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"
}