我想知道如何处理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,服务或控制器层)并重新抛出MyAppJPAException
。MyAppJPAException
应该有一个自定义消息字段,您应该在重新抛出之前设置自定义消息。在MyAppJPAException
处理程序中,您可以在响应中设置该消息,并可以将HTTP状态设置为- HttpStatus.INTERNAL_SERVER_ERROR