【发布时间】:2015-09-23 21:07:38
【问题描述】:
Spring Boot (mvc) 中是否有一种方法可以记录自定义异常并在日志文件中不显示其堆栈跟踪的情况下将其抛出?但对于任何其他异常,仍需查看堆栈跟踪。
详细解释:
我正在使用 spring boot 来创建一个简单的 rest 服务。 我喜欢自定义异常,默认情况下日志中没有堆栈跟踪,并且使用基本异常详细信息(状态、错误、消息)创建 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 ...");
}
有更多的异常会导致在每次抛出之前放置日志语句,我认为这是一种不好的方法。我尝试从服务方法中删除所有日志语句并创建 @ControlledAdvice 我将在其中记录所有自定义异常并重新抛出它们,这样我仍然可以像以前一样获得漂亮的 json: p>
@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;
}
}
现在的问题是,我不仅看到了日志条目,还看到了自定义异常的堆栈跟踪,并且找不到防止这种情况发生的方法。 我认为问题是由于再次抛出它引起的。一个可能的解决方案是为异常创建一个自定义类,我将返回它,但我不喜欢这个想法,因为异常编组似乎工作正常。
有什么提示吗?谢谢。
【问题讨论】:
-
所以它到达了
log.warn行但也记录了整个异常?我可能错了,但我之前见过@ExceptionHandlers 不要扔,他们只是返回ResponseEntity(状态为500等)而不是FWIW ...
标签: java spring logging exception-handling spring-boot