当对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;
}
}
我想通过处理异常类型ConstraintViolationException
可以获得正确的状态代码(400)。要做到这一点,需要将以下代码添加到@Controller
或@ControllerAdvice
:
@ExceptionHandler(ConstraintViolationException.class)
public ResponseEntity<String> onValidationError(Exception ex) {
return new ResponseEntity<String>(HttpStatus.BAD_REQUEST);
}
不幸的是,这不包括好的错误消息体,就像对于无效@RequestBody
的请求,所以我想知道是否有更好的解决方案。