当MethodArgumentNotValidException
在我的Spring应用程序中抛出时,我希望响应:
- 有400码
- 有一个类似于你把
ResponseStatusException
扔进普通控制器时得到的身体
下面是我的代码:
@ControllerAdvice
public class CustomExceptionHandlers extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
FieldError err = ex.getBindingResult().getFieldErrors().get(0);
String msg = "Unknown error";
if (err != null) {
msg = err.getField() + ": " + err.getDefaultMessage();
}
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, msg);
}
}
问题是:它什么也不做(我猜)。我觉得我不应该在ResponseEntityExceptionHandler
中抛出异常。
任何想法?
编辑:显然我想要什么DefaultErrorAttributes
生产,但我仍然不知道如何使用它。
@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
public class CustomExceptionHandler {
@ResponseStatus(BAD_REQUEST)
@ResponseBody
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Map<String, Object>> methodArgumentNotValidException(MethodArgumentNotValidException ex, WebRequest request) {
// Make the message
FieldError err = ex.getBindingResult().getFieldErrors().get(0);
String msg = "Unknown error";
if (err != null) {
msg = err.getField() + ": " + err.getDefaultMessage();
}
// Set attributes
request.setAttribute("javax.servlet.error.status_code", BAD_REQUEST.value(), WebRequest.SCOPE_REQUEST);
request.setAttribute("javax.servlet.error.message", msg, WebRequest.SCOPE_REQUEST);
// Return the error
DefaultErrorAttributes errorAttributes = new DefaultErrorAttributes();
return ResponseEntity.badRequest().body(errorAttributes.getErrorAttributes(request, false));
}
}