我想在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")));
}
}
将特定异常的响应封装在过滤器中是一种好方法吗?这种情况的缺点是什么?
有现成的工具可以实现这一点,因此您不必编写自定义代码。我使用了ControllerAdvice注释,它允许我创建一个类来处理来自任何控制器的任何未捕获异常。在这个类中,我可以有几个方法,其中每个方法处理一个特定的异常或一组异常。但这只是处理例外情况的一种方法。这是一篇非常好的文章,介绍了所有可用的工具和处理错误的标准方法:使用Spring处理REST的错误
但这无济于事,仍然令人崩溃。 我在考虑make try{}catch返回500,并在每个过滤器中进行某种日志记录,但这将导致大量的重复。 有什么办法可以在全球范围内处理吗? MVC服务的添加方式如下:
为什么全局异常处理不能处理筛选器中引发的异常? 我的代码现在是这样的:
我对Spring批处理跳过逻辑有一些问题。我已经配置了一个作业的步骤来跳过两个异常(SQLIntegrityConstraintViolation异常和乐观锁定失败异常): 但当作业运行时,由于我将其配置为跳过的异常,作业以未知状态完成: 我做错什么了吗?我希望这一步跳过负责抛出其中一个异常的项,并继续处理,以便以完成状态结束。
问题内容: 下面是代码片段;基本上,当错误代码不是200时,我正在尝试传播异常。 但是,在服务器响应为500的情况下,出现异常 我真的需要在尝试中包装其余模板交换方法吗?那么代码的目的是什么? 问题答案: 你想要创建一个实现的类,然后使用它的一个实例来设置其余模板的错误处理: 此外,Spring仅提供一个类,你可以扩展该类,而不是实现接口,以防万一你只想覆盖该方法。
主要内容:DefaultHandlerExceptionResolver,ResponseStatusExceptionResolver,ExceptionHandlerExceptionResolver,SimpleMappingExceptionResolver在实际的应用开发中,经常会不可避免地遇到各种可预知的、不可预知的异常,此时我们就需要对这些异常处理,以保证程序正常运行。 Spring MVC 提供了一个名为 HandlerExceptionResolver 的异常处理器接口,它可以
但是,在服务器发出500响应的情况下,我得到了异常 我真的需要在try中包装rest模板交换方法吗?那么代码的目的是什么呢?