Spring Data Rest异常处理 - 返回一般错误响应

时间:2015-05-14 18:54:43

标签: spring spring-boot exception-handling spring-data-jpa spring-data-rest

我想知道如何处理Spring Data Rest中的内部服务器错误类型异常,例如由于格式错误的请求或数据库崩溃导致的JPA异常等。我做了一些研究发现,更好的方法是使用@ControllerAdvice,但无法找到它的任何工作示例。我看了这两个问题,但仍然没有答案。

How can I handle exceptions with Spring Data Rest and the PagingAndSortingRepository?

global exception handling for rest exposed spring-data

有人可以帮我提供一个如何使用@ControllerAdvice的工作示例,并在出现异常时将自定义错误响应写回客户端。

2 个答案:

答案 0 :(得分:4)

你可以这样做:

@ControllerAdvice(basePackageClasses = RepositoryRestExceptionHandler.class)
public class GenericExceptionHandler {

    @ExceptionHandler
    ResponseEntity handle(Exception e) {
        return new ResponseEntity("Some message", new HttpHeaders(), HttpStatus.BAD_REQUEST);
    }
}

答案 1 :(得分:0)

这是我为所有请求验证错误执行的方式,

@RestControllerAdvice
public class ApplicationExceptionHandler {

     @ExceptionHandler
     @ResponseStatus(HttpStatus.BAD_REQUEST)
     public ResponseBean handle(MethodArgumentNotValidException exception){

        StringBuilder messages = new StringBuilder();
        ResponseBean response = new ResponseBean();

        int count = 1;
        for(ObjectError error:exception.getBindingResult().getAllErrors()){
            messages.append(" "+count+"."+error.getDefaultMessage());
            ++count;
        }

        response.setMessage(messages.toString());
        return response;
    }
}

其中ResponseBean是我的应用程序特定类。

对于JPA错误,异常是RuntimeExceptions,顶级异常是 - org.springframework.dao.DataAccessException

如果您希望向客户端发送通用消息,则无需捕获 - 重新抛出DAO,服务或控制器层。只需为DataAccessException添加一个异常处理程序,就完成了。

如果您希望为客户端设置特定异常的特定消息,则需要编写扩展DataAccessException的特定于应用程序的异常层次结构,例如MyAppJPAException。您需要在应用程序代码中捕获 - DataAccessException(在DAO,服务或控制器层)并重新抛出MyAppJPAExceptionMyAppJPAException应该有一个自定义消息字段,您应该在重新投掷之前设置自定义消息。在MyAppJPAException处理程序中,您将该消息设置为响应,并可将HTTP状态设置为 - HttpStatus.INTERNAL_SERVER_ERROR