• SpringBoot 拦截org.thymeleaf.exceptions.TemplateInputException异常


    SpringBoot 拦截thymeleaf异常

    org.thymeleaf.exceptions.TemplateInputException异常

    org.thymeleaf.exceptions.TemplateProcessingE
    xception: Could not parse as each: "message : xxx " (template: “xxxx” - line xx, col xx)

    thymeleaf异常复现

    你是故意的,还是不小心的 ----我是故意的

    image.png

    成功拦截,使用自定义试图,捕获主要信息,减去一大推报错代码,只显示正常信息,显得优雅

    微信图片_20230831091552.png
    微信图片_20230831091552.png

    为什么不生效

    首先应该知道 @ControllerAdvice 是拦截不成功的,百世(试)不得其姐(解),正常来说,异常是会走下面这一行代码的

    @ControllerAdvice
    public class SysGlobalExceptionHandler<T> extends BasicController<Class<?>>{
        @ExceptionHandler(Exception.class)
        public ResponseEntity<Object> exception(Throwable e) {
        // 处理异常
        return ResponseEntity.status(this.response.getStatus()).body("Exception未定义异常" + e.getMessage());
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    但是他是不正常的(因为拦截不到),为什么,我也不知道,但是AI是这么说的:@ControllerAdvice只能处理通过控制器抛出的异常,并不能处理其他组件抛出的异常。如果需要处理其他组件的异常,需要使用其他的异常处理机制。
    听君一席话,如菜鸟开大

    怎么实现拦截生效呢

    当然是重新实现 ErrorController接口了

    public Object errorHandle(){
        //判断状态码是500
        if (this.response.getStatus() == HttpStatus.INTERNAL_SERVER_ERROR.value()) {
        // 获取异常信息
        Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception");
        // 判断是不是模板异常
        if (throwable.getCause() instanceof TemplateInputException) {
            //这里其实也可以是TemplateInputException,throwable.getCause() instanceof TemplateInputException也可以是TemplateProcessingException,最终都是抛出TemplateProcessingException异常
            TemplateProcessingException templateProcessingException = (TemplateProcessingException) throwable.getCause();
            ParseException parseException = (ParseException) templateProcessingException.getCause();
            //这里就是自定义逻辑了
            this.msgFormat("模板出现异常 %s ", parseException.getLocalizedMessage());
            modelAndView.setViewName("err");
            // return this.Output(throwable.getClass());
            //return ResponseEntity.status(this.response.getStatus()).body(parseException.getLocalizedMessage());
        }
    }
    
    // this.response就是抛出原来的结果,就比如你写的逻辑没有成功拦截到500状态码的其他异常,是啥就显示啥
    return this.response;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    这样就完成实现拦截到thymeleaf的异常,@ControllerAdvice处理不了的异常可以使用ErrorController来处理,耶稣也拦不住,鲁某说的

    微信图片_20230831091552.png

    有很多东西是后知后觉的,一年前我可能不知道怎么处理,只能去处理业务,避免出现这种异常,时间久了,好多知识点就慢慢领悟了。(多动手)

    微信图片_20230831091607.png

  • 相关阅读:
    最长偶串的长度
    少儿编程--枚举算法
    标准库函数使用及源码
    js笔试题(5)
    springCloud笔记(狂神)
    python中的none
    手写java冒泡、插入、选择、快速、归并排序算法
    【MySQL】MySQL的安装,登录,配置和相关命令
    网络安全(黑客)自学
    【系统设计系列】 应用层与微服务
  • 原文地址:https://blog.csdn.net/qq_42410310/article/details/132720177