gpt4 book ai didi

java - Spring中如何管理过滤器中抛出的异常?

转载 作者:IT老高 更新时间:2023-10-28 13:01:33 27 4
gpt4 key购买 nike

我想使用通用的方式来管理 5xx 错误代码,让我们具体说一下当我的整个 spring 应用程序中的数据库关闭时的情况。我想要一个漂亮的错误 json 而不是堆栈跟踪。

对于 Controller ,我有一个针对不同异常的 @ControllerAdvice 类,这也捕获了数据库在请求中间停止的情况。但这并不是全部。我也碰巧有一个自定义 CorsFilter 扩展 OncePerRequestFilter 并且当我调用 doFilter 我得到 CannotGetJdbcConnectionException 和它不会由 @ControllerAdvice 管理。我在网上阅读了几件事,这让我更加困惑。

所以我有很多问题:

  • 我需要实现自定义过滤器吗?我找到了 ExceptionTranslationFilter 但这仅处理 AuthenticationExceptionAccessDeniedException
  • 我想过实现自己的HandlerExceptionResolver,但这让我怀疑,我没有任何自定义异常要管理,一定有比这更明显的方法。我还尝试添加一个 try/catch 并调用 HandlerExceptionResolver 的实现(应该足够好,我的异常没什么特别的)但这没有在响应中返回任何内容,我得到一个状态 200和空荡荡的 body 。

有什么好的方法可以解决这个问题吗?谢谢

最佳答案

这就是我所做的:

我阅读了有关过滤器的基础知识 here我发现我需要创建一个自定义过滤器,该过滤器将位于过滤器链中的第一个,并且将有一个 try catch 来捕获可能在那里发生的所有运行时异常。然后我需要手动创建 json 并将其放入响应中。

这是我的自定义过滤器:

public class ExceptionHandlerFilter extends OncePerRequestFilter {

@Override
public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
try {
filterChain.doFilter(request, response);
} catch (RuntimeException e) {

// custom error response class used across my project
ErrorResponse errorResponse = new ErrorResponse(e);

response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
response.getWriter().write(convertObjectToJson(errorResponse));
}
}

public String convertObjectToJson(Object object) throws JsonProcessingException {
if (object == null) {
return null;
}
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(object);
}
}

然后我将它添加到 CorsFilter 之前的 web.xml 中。它有效!

<filter> 
<filter-name>exceptionHandlerFilter</filter-name>
<filter-class>xx.xxxxxx.xxxxx.api.controllers.filters.ExceptionHandlerFilter</filter-class>
</filter>


<filter-mapping>
<filter-name>exceptionHandlerFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

关于java - Spring中如何管理过滤器中抛出的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34595605/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com