java - Spring MVC中的异常处理——异常描述

标签 java spring rest spring-mvc exception

我有一个用 @ResponseStatus 注释的异常,如下所示:

@ResponseStatus(value = HttpStatus.UNPROCESSABLE_ENTITY, reason = "Restrioctions violated. Need confirmation.")
@ResponseBody
public class RestrictionExceptions extends Exception {

    private List<RestrictionViolation> restrictionViolations;

但是,当引发异常时,@ResponseStatus 声明中只有 HTTP 状态代码和 reason 。是否可以在错误响应正文中包含 restrictionViolations

我想将异常声明保留在异常本身中,如果可能的话,我不想在 Controller 中引入一些异常处理方法。

最佳答案

您可以使用您希望在正文中包含的字段创建一个 ErrorResource:

public class ErrorResource {
    private String reason;
    private String value;
    private List<RestrictionViolation> restrictionViolations;
    ....
}

并在处理程序中处理异常:

@ControllerAdvice
public class RestrictionExceptionsHandler {

@ExceptionHandler({ RestrictionExceptions.class })
protected ResponseEntity<ErrorResource> handleInvalidRequest(Exception exception) {
    RestrictionExceptions restrictionExceptions = (RestrictionExceptions) exception;

    ErrorResource error = new ErrorResource();
    Class clazz = exception.getClass();
    if(clazz.isAnnotationPresent(ResponseStatus.class)){
         ResponseStatus responseStatus = (ResponseStatus) clazz.getAnnotation(ResponseStatus.class);
        error.setValue(responseStatus.value());
        error.setReason(responseStatus.reason());
    }
    error.setRestrictionViolations(restrictionExceptions.getRestrictionViolations());

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);

    return new ResponseEntity<ErrorResource>(error, error.getValue());
}
}

关于java - Spring MVC中的异常处理——异常描述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34783490/

相关文章:

java - 什么是原始类型,为什么我们不应该使用它呢?

java - fireTableDataChanged 对 JTable 没有影响

java - Spring RestController 与其他 Java 类交互

java - 休息 API | Jersey jar | 405错误

java - 通过 GET 方法传递到 Java 中的 RESTful Web 服务时,字符串在 '#' 处被分割

java - java中打印时 'long'类型的数字改变了它的值

java - 跳过 33/31/32 帧,尽管我使用的是 runOnUiThread

java - 使用 Spring 框架的 WebSocketClient 时如何修复 NoClassDefFoundError

javax.transaction.Transactional 与 org.springframework.transaction.annotation.Transactional

rest - 第 3 方 API 返回 500 错误,我的 API 应返回什么代码