Spring Data Rest异常处理-返回通用错误响应



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

我如何处理异常与Spring Data Rest和PagingAndSortingRepository?

全局异常处理

有人可以帮助我如何使用@ControllerAdvice和写一个自定义的错误响应回客户端的一个工作的例子,每当有一个异常。

你可以这样做:

@ControllerAdvice(basePackageClasses = RepositoryRestExceptionHandler.class)
public class GenericExceptionHandler {
    @ExceptionHandler
    ResponseEntity handle(Exception e) {
        return new ResponseEntity("Some message", new HttpHeaders(), HttpStatus.BAD_REQUEST);
    }
}

这是我对所有请求验证错误的处理方式,

@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,服务或控制器层中进行catch - rethrow。只需像上面那样为DataAccessException添加一个异常处理程序,您就完成了。

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

最新更新