SpringBoot 如何正确拦截thymeleaf异常

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异常复现

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

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

为什么不生效

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

java 复制代码
@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());
    }
}

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

怎么实现拦截生效呢

当然是重新实现 ErrorController接口了

java 复制代码
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;

}

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

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

相关推荐
用户8307196840822 天前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
Java水解2 天前
Spring Boot 视图层与模板引擎
spring boot·后端
Java水解2 天前
一文搞懂 Spring Boot 默认数据库连接池 HikariCP
spring boot·后端
洋洋技术笔记2 天前
Spring Boot Web MVC配置详解
spring boot·后端
初次攀爬者3 天前
Kafka 基础介绍
spring boot·kafka·消息队列
用户8307196840823 天前
spring ai alibaba + nacos +mcp 实现mcp服务负载均衡调用实战
spring boot·spring·mcp
Java水解3 天前
SpringBoot3全栈开发实战:从入门到精通的完整指南
spring boot·后端
初次攀爬者4 天前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺4 天前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
Derek_Smart4 天前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot