我通过Spring实现了很少的Rest Web服务。问题是如果抛出任何异常,webservice将返回带有包含stacktrace的格式化错误消息的json对象。我可以单点处理异常,并使用不包含堆栈跟踪的消息返回我的自定义json对象吗?
我看到了spring mvc的描述,但我并没有真正用它来构建我的视图等。
答案 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);
}
}