我有一个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()
中,它会创建状态和相关消息的错误,但不会返回我的回复。
我还没有想出如何解决这个问题,如果有人能提供帮助,我真的很感激。
谢谢!
答案 0 :(得分:0)
通过执行以下操作,我解决了这个问题(我认为这是一个Spring Boot问题)。
单独的Rest和Mvc控制器 在此处查看我的问题:Spring MVC: Get i18n message for reason in @RequestStatus on a @ExceptionHandler
注入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();
}
}
}