Spring Rest响应中异常的Stacktrace

时间:2014-08-21 19:05:29

标签: spring rest exception-handling

我通过Spring实现了很少的Rest Web服务。问题是如果抛出任何异常,webservice将返回带有包含stacktrace的格式化错误消息的json对象。我可以单点处理异常,并使用不包含堆栈跟踪的消息返回我的自定义json对象吗?

我看到了spring mvc的描述,但我并没有真正用它来构建我的视图等。

3 个答案:

答案 0 :(得分:2)

Spring提供了一个现成的解决方案,可以从一个点处理所有自定义异常。您需要的是异常控制器中的@ControllerAdvice注释:

@ControllerAdvice
public class GlobalDefaultExceptionHandler {

    @ExceptionHandler(Exception.class)
    public String exception(Exception e) {

        return "error";
    }
}

如果你想深入到个人控制器级别的@ExceptionHandler,或者在全球应用级别here @ControllerAdvice是一个很好的博客。

答案 1 :(得分:1)

我知道为时已晚,只是指出一些可能对其他人有帮助的解决方案!

情况1 :如果您使用的是application.properties文件,请在属性文件中添加以下行。

server.error.include-stacktrace=on_trace_param

情况2 :如果您使用的是application.yml文件,请在yml文件中添加以下行。

server:
  error:
    include-stacktrace: on_trace_param

情况3 如果它们都不起作用,请尝试以下更改:

尝试通过覆盖如下所示的异常类中的fillInStackTrace方法来抑制堆栈跟踪。

public class DuplicateFoundException extends RuntimeException {
    @Override
    public synchronized Throwable fillInStackTrace() {
        return this;
    }
}

ps1:我提到了this article

答案 2 :(得分:0)

要在单个点处理从spring应用程序抛出的异常,这是执行此操作的最佳方法。 @ControllerAdvice将创建一个方面连接点,它将拦截绑定到相应公共方法的所需匹配类型的所有异常。这里,public ResponseEntity handleDataIntegrityViolationException(DataIntegrityViolationException dataIntegrityViolationException,         WebRequest请求)处理在一个地方抛出系统的DataIntegrityViolationException。

@ControllerAdvice
public class GlobalControllerExceptionHandler {
private Logger logger = Logger.getLogger(this.getClass());
private HttpHeaders header = new HttpHeaders();

@Autowired
private MessageSource messageSource;

public GlobalControllerExceptionHandler() {
    header.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
}

/**
 * @param dataIntegrityViolationException
 * @param request
 * @return
 */
@ExceptionHandler({ DataIntegrityViolationException.class })
public ResponseEntity<?> handleDataIntegrityViolationException(DataIntegrityViolationException dataIntegrityViolationException,
        WebRequest request) {

    String message = ExceptionUtils.getMessage(dataIntegrityViolationException);
    logger.error("*********BEGIN**************DataIntegrityViolationException******************BEGIN*******************\n");
    logger.error(message, dataIntegrityViolationException.fillInStackTrace());
    logger.error("*********ENDS**************DataIntegrityViolationException*******************ENDS*****************************\n");
    return ResponseEntity.status(HttpStatus.CONFLICT).headers(header).body(dataIntegrityViolationException);
}

}