当前位置: 首页 > 知识库问答 >
问题:

用于处理异常的Spring筛选器

关项明
2023-03-14

我想在Spring中处理某些异常并将REST响应包装成另一种对象格式。

因此,我想到了使用过滤器并检查响应状态代码的想法,例如,如果是400,则意味着请求不正确,因此我可以将响应包装为所需的JSON格式,下面是代码示例:

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        filterChain.doFilter(servletRequest, servletResponse);

        if(((HttpServletResponse) servletResponse).getStatus() == 400){

            servletResponse.resetBuffer();
            ((HttpServletResponse) servletResponse).setStatus(200);
            servletResponse.setContentType("application/json; charset=UTF-8");
            servletResponse.setCharacterEncoding("UTF-8");

            PrintWriter out = servletResponse.getWriter();
            out.println(new ObjectMapper().writeValueAsString(new IgResponseDto<>(IgResponseCode.BAD_REQUEST, "en")));
        }
    }

将特定异常的响应封装在过滤器中是一种好方法吗?这种情况的缺点是什么?

共有1个答案

蒙弘图
2023-03-14

有现成的工具可以实现这一点,因此您不必编写自定义代码。我使用了ControllerAdvice注释,它允许我创建一个类来处理来自任何控制器的任何未捕获异常。在这个类中,我可以有几个方法,其中每个方法处理一个特定的异常或一组异常。但这只是处理例外情况的一种方法。这是一篇非常好的文章,介绍了所有可用的工具和处理错误的标准方法:使用Spring处理REST的错误

 类似资料:
  • 但这无济于事,仍然令人崩溃。 我在考虑make try{}catch返回500,并在每个过滤器中进行某种日志记录,但这将导致大量的重复。 有什么办法可以在全球范围内处理吗? MVC服务的添加方式如下:

  • 为什么全局异常处理不能处理筛选器中引发的异常? 我的代码现在是这样的:

  • 我对Spring批处理跳过逻辑有一些问题。我已经配置了一个作业的步骤来跳过两个异常(SQLIntegrityConstraintViolation异常和乐观锁定失败异常): 但当作业运行时,由于我将其配置为跳过的异常,作业以未知状态完成: 我做错什么了吗?我希望这一步跳过负责抛出其中一个异常的项,并继续处理,以便以完成状态结束。

  • 问题内容: 下面是代码片段;基本上,当错误代码不是200时,我正在尝试传播异常。 但是,在服务器响应为500的情况下,出现异常 我真的需要在尝试中包装其余模板交换方法吗?那么代码的目的是什么? 问题答案: 你想要创建一个实现的类,然后使用它的一个实例来设置其余模板的错误处理: 此外,Spring仅提供一个类,你可以扩展该类,而不是实现接口,以防万一你只想覆盖该方法。

  • 主要内容:DefaultHandlerExceptionResolver,ResponseStatusExceptionResolver,ExceptionHandlerExceptionResolver,SimpleMappingExceptionResolver在实际的应用开发中,经常会不可避免地遇到各种可预知的、不可预知的异常,此时我们就需要对这些异常处理,以保证程序正常运行。 Spring MVC 提供了一个名为 HandlerExceptionResolver 的异常处理器接口,它可以

  • 但是,在服务器发出500响应的情况下,我得到了异常 我真的需要在try中包装rest模板交换方法吗?那么代码的目的是什么呢?