在Tomcat中部署的Spring启动应用程序中,没有@ResponseBody从@ExceptionHandler返回

时间:2015-03-16 10:59:39

标签: rest spring-mvc tomcat spring-boot exceptionhandler

我有一个Spring Boot Web应用程序,可以从STS运行得很好,但在从Tom文件中运行时会显示不同的行为。

我使用Thymeleaf来处理我的所有网页,但我有几页使用jQuery发送异步调用并使用户体验更具动态。

无论如何,我有一个调用服务方法的Controller方法,该方法可能会抛出一个RuntimeException,我会这样处理:

@ExceptionHandler(MyRuntimeException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public @ResponseBody String handleMyRuntimeException(MyRuntimeException exception) {
    return "Oops an error happened : " + exception.getMessage();
}

在JS中,我使用上面返回的响应主体在屏幕上显示消息。

在STS中运行我的应用程序时工作得非常好但是一旦我切换到在Tomcat中部署它,ErrorPageFilter就会被调用,而doFilter()它会执行:

if (status >= 400) {
    handleErrorStatus(request, response, status, wrapped.getMessage());
    response.flushBuffer();
}

handleErrorStatus()中,它会创建状态和相关消息的错误,但不会返回我的回复。

我还没有想出如何解决这个问题,如果有人能提供帮助,我真的很感激。

谢谢!

1 个答案:

答案 0 :(得分:0)

通过执行以下操作,我解决了这个问题(我认为这是一个Spring Boot问题)。

  1. 单独的Rest和Mvc控制器 在此处查看我的问题:Spring MVC: Get i18n message for reason in @RequestStatus on a @ExceptionHandler

  2. 注入Jackson转换器并自己写回复:

    @ControllerAdvice(annotations = RestController.class)
    @Priority(1)
    @ResponseBody
    public class RestControllerAdvice {
        @Autowired
        private MappingJackson2HttpMessageConverter jacksonMessageConverter;
    
        @ExceptionHandler(RuntimeException.class)
        @ResponseStatus(value = HttpStatus.BAD_REQUEST)
        public void handleRuntimeException(HttpServletRequest request, HttpServletResponse response, RuntimeException exception) {
            try {
                jacksonMessageConverter.write(new MyRestResult(translateMessage(exception)), MediaType.APPLICATION_JSON, new ServletServerHttpResponse(response));
                response.flushBuffer(); // Flush to commit the response
                } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }