【问题标题】:Prevent Tomcat from overriding error response returned by controller advice防止 Tomcat 覆盖控制器建议返回的错误响应
【发布时间】:2018-06-20 08:54:58
【问题描述】:

我已经实现了一个 RestControllerAdvice 来处理 Spring Boot-Tomcat Web 应用程序中的异常,如下所示:

@RestControllerAdvice 
public class ExceptionHandlerRest{
 private Logger logger=LoggerFactory.getLogger(getClass());

 @ExceptionHandler(Exception.class)
 public ResponseEntity<?> handleException(Exception ex){
  logger.error("System Error", ex);
  SimpleResponse=new SimpleResponse(ex.getMessage(),"Error code 001"));
  return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
 }

}

因此,每当 Web 请求导致异常时,我希望上面的处理程序返回状态 500 和包含内容的 json:"{"technicalMessage":"NullPointerException","userMessage":"Error Code 001"}

然而,一个 html 错误页面正在打印整个堆栈跟踪,如下所示:

SimpleResponse 的定义如下:

public class SimpleResponse{
   String technicalMessage,userMessage;

   //public getters and setters


}

我已经放置了调试点,并观察到代码流确实可以正确地返回 RestControllerAdvice 的 handleException 语句。我认为一些tomcat如何忽略我的响应并显示异常堆栈跟踪。如何让我的应用程序以 json 格式返回错误消息?

【问题讨论】:

  • 是的,我确定。我调试并控制到异常处理程序并正确返回 POJO 响应,但有些 tomcat 忽略它并显示默认错误页面
  • 这是在嵌入式 Tomcat 上还是在外部 Tomcat 上? (PS。我注意到你的最后一段,所以我删除了我原来的评论。)
  • 是嵌入式tomcat
  • 我不能用你提供的代码重现这个,所以我猜错误在别处。 BaseScreeningException 是什么?这是在您的异常处理程序中抛出的吗?
  • 当它看到一些错误的请求时,它被休息控制器抛出

标签: java spring-boot tomcat


【解决方案1】:

我可以解决这个问题。这个问题发生在使用 @RequestMapping(produces=MediaType.application_pdf_value) 注释的休息控制器上。当错误被抛出并被错误处理程序接收时,由于实际控制器的生产属性,POJO 没有转换为 JSON。我删除了生产属性,而是将内容类型明确设置为响应。现在两种情况都可以正常工作,下载 pdf 或显示异常消息。

【讨论】:

    猜你喜欢
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多