在请求标头验证错误的情况下,让 Spring 响应 400(而不是 500)

obe*_*ies 6 validation spring spring-mvc bean-validation spring-boot

当对 Spring MVC@RequestMapping方法的参数进行验证时,Spring 根据参数的类型以不同的状态代码进行响应:

  • 对于无效@RequestBody参数,Spring 响应 400
  • 对于无效的@RequestHeader@PathVariable、 和@RequestParam参数,Spring 响应 500。

是否可以对此进行更改,以便 Spring 在所有情况下都以相同的 400 响应进行响应?


这是我的代码:

@Controller
@Validated
public class WebController {

    @RequestMapping(method = RequestMethod.POST, path = "/action")
    public ResponseEntity<String> doAction(
            @RequestHeader("Header-Name") @Valid LatinString headerValue,
            @RequestBody @Valid Struct body) {
        return new ResponseEntity<>(HttpStatus.OK);
    }
}
Run Code Online (Sandbox Code Playgroud)
public class LatinString {

    @Pattern(regexp = "[A-Za-z]*")
    private String value;

    public LatinString(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}
Run Code Online (Sandbox Code Playgroud)
public class Struct {

    @Pattern(regexp = "[A-Za-z0-9.-]{1,255}")
    private String domain;

    public String getDomain() {
        return domain;
    }
}
Run Code Online (Sandbox Code Playgroud)

obe*_*ies 5

我认为可以通过处理异常类型来获取正确的状态代码(400)ConstraintViolationException。为此,需要将以下代码添加到@Controller或 a @ControllerAdvice

    @ExceptionHandler(ConstraintViolationException.class)
    public ResponseEntity<String> onValidationError(Exception ex) {
        return new ResponseEntity<String>(HttpStatus.BAD_REQUEST);
    }
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不包括像 invalid 请求那样的漂亮的错误消息正文@RequestBody,所以我想知道是否有更好的解决方案。