如果请求标头验证错误,请让Spring响应400(而不是500)

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

当对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);
    }
}
public class LatinString {

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

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

    public String getValue() {
        return value;
    }
}
public class Struct {

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

    public String getDomain() {
        return domain;
    }
}
spring validation spring-boot spring-mvc bean-validation
1个回答
1
投票

我想通过处理异常类型ConstraintViolationException可以获得正确的状态代码(400)。要做到这一点,需要将以下代码添加到@Controller@ControllerAdvice

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

不幸的是,这不包括好的错误消息体,就像对于无效@RequestBody的请求,所以我想知道是否有更好的解决方案。

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