另一种可能性是在上述两种解决方案之间采用混合方法:
@ControllerAdvicepublic class MyExceptionHandler extends ResponseEntityExceptionHandler {@ExceptionHandler({ MyDataException.class })protected ResponseEntity<Object> handleInvalidRequest(RuntimeException e, WebRequest request) { MyDataExceptionire = (MyDataException) e; List<FieldErrorResource> fieldErrorResources = new ArrayList<>(); List<FieldError> fieldErrors = ire.getErrors().getFieldErrors(); for (FieldError fieldError : fieldErrors) { FieldErrorResource fieldErrorResource = new FieldErrorResource(); fieldErrorResource.setResource(fieldError.getObjectName()); fieldErrorResource.setField(fieldError.getField()); fieldErrorResource.setCode(fieldError.getCode()); fieldErrorResource.setMessage(fieldError.getDefaultMessage()); fieldErrorResources.add(fieldErrorResource); } ErrorResource error = new ErrorResource("MyDataException", ire.getMessage()); error.setFieldErrors(fieldErrorResources); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); return handleExceptionInternal(e, error, headers, HttpStatus.UNPROCESSABLE_ENTITY, request);}}在此博客上提出的解决方案
编辑 :
我还从博客中添加了FieldError和ErrorResource类,因为将来可能会删除它:
错误资源:
@JsonIgnoreProperties(ignoreUnknown = true)public class ErrorResource {private String pre;private String message;private List<FieldErrorResource> fieldErrors;public ErrorResource() { }public ErrorResource(String pre, String message) { this.pre = pre; this.message = message;}public String getCode() { return pre; }public void setCode(String pre) { this.pre = pre; }public String getMessage() { return message; }public void setMessage(String message) { this.message = message; }public List<FieldErrorResource> getFieldErrors() { return fieldErrors; }public void setFieldErrors(List<FieldErrorResource> fieldErrors) { this.fieldErrors = fieldErrors;}}FieldErrorResource:
@JsonIgnoreProperties(ignoreUnknown = true)public class FieldErrorResource {private String resource;private String field;private String pre;private String message;public String getResource() { return resource; }public void setResource(String resource) { this.resource = resource; }public String getField() { return field; }public void setField(String field) { this.field = field; }public String getCode() { return pre; }public void setCode(String pre) { this.pre = pre; }public String getMessage() { return message; }public void setMessage(String message) { this.message = message; }}


