我想出的一个解决方案是针对来自Spring控制器的异常,这可能足以满足很多场景。
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler
{
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
@ExceptionHandler({RollbackException.class, DataIntegrityViolationException.class})
public @ResponseBody
Map<String,Object> allRollbacks
(
Exception exception,
HttpServletRequest request,
HttpServletResponse response
)
{
HashMap<String, Object> result = new HashMap<>();
result.put("error", HttpStatus.BAD_REQUEST.name());
Throwable exceptionToLog = Throwables.getRootCause(exception);
String exceptionClassName = exceptionToLog.getClass().getCanonicalName();
String message = exceptionToLog.getMessage();
log.info("{}: {}", exceptionClassName, message);
result.put("exception", exceptionClassName);
result.put("message", message);
return result;
}
}
在这种情况下,我们将看到在从截击来的日志短根源消息,并且客户端将接收到类似JSON响应:
{
"exception": "org.postgresql.util.PSQLException",
"error": "BAD_REQUEST",
"message": "ERROR: duplicate key value violates unique constraint \"ukr6y7o33kjy3vispmnl7if5d4s\"\n Detail: Key (ref1_id, ref2_id, ref3_id)=(8325842b-ee40-48c3-ab6b-5b914e70b583, 9b0f5356-baa8-4ae2-a149-4f7b1f2dbfda, 9281369c-10a6-4649-bcd3-c18d2e5cd287) already exists."
}
来源
2016-11-02 06:35:58
Val