我有一个Spring Boot Web应用程序,它可以从STS正常运行,但是从WAR文件在Tomcat中运行时却表现出不同的行为。
我使用Thymeleaf来处理我的所有网页,但是我有几个页面正在使用jQuery发送异步呼叫并使用户体验更加动态。
无论如何,我有一个Controller方法调用一个服务方法,该服务方法可能会抛出RuntimeException我以这种方式处理的方法:
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()其中执行:
ErrorPageFilter
doFilter()
if (status >= 400) { handleErrorStatus(request, response, status, wrapped.getMessage()); response.flushBuffer(); }
在handleErrorStatus()其中创建一个带有状态和相关消息的错误,但不会返回我的响应。
handleErrorStatus()
我还没有弄清楚如何解决这个问题,如果有人可以提供帮助,我将不胜感激。
谢谢!
我通过执行以下操作解决了这个问题(我认为这是Spring Boot问题)。
单独的Rest和Mvc控制器在这里查看我的问题:SpringMVC:在@ExceptionHandler上的@RequestStatus中获取i18n消息的原因
注入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(); } } }