我想知道如何处理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的工作示例,并在出现异常时将自定义错误响应写回客户端。
答案 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,服务或控制器层)并重新抛出MyAppJPAException
。 MyAppJPAException
应该有一个自定义消息字段,您应该在重新投掷之前设置自定义消息。在MyAppJPAException
处理程序中,您将该消息设置为响应,并可将HTTP状态设置为 - HttpStatus.INTERNAL_SERVER_ERROR