防止在 Spring Boot 应用程序中对自定义异常进行堆栈跟踪日志记录
有没有办法在Spring Boot(MVC)中记录自定义异常并抛出它,而不会在日志文件中显示其堆栈跟踪?但对于任何其他异常,仍请参阅堆栈跟踪。
详细解释:
我正在使用弹簧靴来创建一个简单的休息服务。我喜欢对于自定义异常,默认情况下日志中没有堆栈跟踪,并且使用基本的异常详细信息(状态,错误,消息)创建JSON响应。
问题是它也根本不创建任何日志条目,因此我必须手动执行此操作:
自定义例外
@ResponseStatus(value = HttpStatus.CONFLICT)
public class DuplicateFoundException extends RuntimeException {
public DuplicateFoundException(String message) {
super(message);
}
}
服务方法中的异常引发(@RestController中)
if (!voteDao.findByItemAndUser(item, voteDto.getUserId()).isEmpty()) {
log.warn("... already voted ..."); //TODO: don't do this for every throw
throw new DuplicateFoundException("... already voted ...");
}
有更多的异常会导致在每次抛出之前放置日志语句,我认为这是一个不好的方法。我尝试从服务方法中删除所有日志语句,并创建了记录所有自定义异常并重新抛出它们的位置,以便我仍然像以前一样获得漂亮的JSON:@ControllerAdvice
@ControllerAdvice
public class RestExceptionHandler {
private static final Logger log = Logger.getLogger(RestExceptionHandler.class);
@ExceptionHandler
public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null) {
log.warn(e.getMessage());
} else {
log.error("...");
}
throw e;
}
}
现在的问题是,我不仅看到日志条目,还看到自定义异常的堆栈跟踪,并且找不到如何防止这种情况的方法。我认为问题是由再次投掷它引起的。一个可能的解决方案可能是为异常创建一个自定义类,我将返回它,但我不喜欢这个想法,因为异常编组似乎工作正常。
任何提示?