在 Tomcat 中部署的 Spring 引导应用程序中没有从 @ExceptionHandler 返回 @ResponseBody
No @ResponseBody returned from @ExceptionHandler in Spring boot app deployed in Tomcat
我有一个 Spring 引导 Web 应用程序,它在 STS 中运行良好,但在 WAR 文件中 Tomcat 中的 运行 时显示不同的行为。
我使用 Thymeleaf 来处理我的所有网页,但我有几个页面使用 jQuery 发送异步调用并使用户体验更加动态。
无论如何,我有一个调用服务方法的控制器方法,该方法可能会抛出 RuntimeException
,我是这样处理的:
@ExceptionHandler(MyRuntimeException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public @ResponseBody String handleMyRuntimeException(MyRuntimeException exception) {
return "Oops an error happened : " + exception.getMessage();
}
在 JS 中,我使用上面的响应主体 I return 在屏幕上显示消息。
当 运行 我的应用程序在 STS 中时,它工作得很好,但是一旦我切换到在 Tomcat 中部署它, ErrorPageFilter
就会被调用,在 doFilter()
中它会:
if (status >= 400) {
handleErrorStatus(request, response, status, wrapped.getMessage());
response.flushBuffer();
}
在 handleErrorStatus()
中,它会创建状态和相关消息的错误,但不会 return 我的回复。
我还没有想出如何解决这个问题,如果有人能提供帮助,我将不胜感激。
谢谢!
我通过执行以下操作解决了这个问题(我认为这是一个 Spring 引导问题)。
分开 Rest 和 Mvc 控制器
在这里查看我的问题:
注入 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();
}
}
}
我有一个 Spring 引导 Web 应用程序,它在 STS 中运行良好,但在 WAR 文件中 Tomcat 中的 运行 时显示不同的行为。
我使用 Thymeleaf 来处理我的所有网页,但我有几个页面使用 jQuery 发送异步调用并使用户体验更加动态。
无论如何,我有一个调用服务方法的控制器方法,该方法可能会抛出 RuntimeException
,我是这样处理的:
@ExceptionHandler(MyRuntimeException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public @ResponseBody String handleMyRuntimeException(MyRuntimeException exception) {
return "Oops an error happened : " + exception.getMessage();
}
在 JS 中,我使用上面的响应主体 I return 在屏幕上显示消息。
当 运行 我的应用程序在 STS 中时,它工作得很好,但是一旦我切换到在 Tomcat 中部署它, ErrorPageFilter
就会被调用,在 doFilter()
中它会:
if (status >= 400) {
handleErrorStatus(request, response, status, wrapped.getMessage());
response.flushBuffer();
}
在 handleErrorStatus()
中,它会创建状态和相关消息的错误,但不会 return 我的回复。
我还没有想出如何解决这个问题,如果有人能提供帮助,我将不胜感激。
谢谢!
我通过执行以下操作解决了这个问题(我认为这是一个 Spring 引导问题)。
分开 Rest 和 Mvc 控制器 在这里查看我的问题:
注入 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(); } } }