异常处理器

什么是异常处理器

Spring MVC在处理器方法执行过程中出现了异常,可以采用异常处理器进行应对。一句话概括异常处理器作用:处理器方法执行过程中出现了异常,跳转到对应的视图,在视图上展示友好信息。
SpringMVC为异常处理提供了一个接口:HandlerExceptionResolver,核心方法是:resolveException


package org.springframework.web.servlet;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;

public interface HandlerExceptionResolver {
    @Nullable
    ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex);
}

该方法用来编写具体的异常处理方案。返回值ModelAndView,表示异常处理完之后跳转到哪个视图,HandlerExceptionResolver 接口有两个常用的默认实现:

  • DefaultHandlerExceptionResolver
  • SimpleMappingExceptionResolver

默认异常处理器(DefaultHandlerExceptionResolver)

DefaultHandlerExceptionResolver是默认的异常处理器。核心方法是doResolveException


自定义异常处理器(SimpleMappingExceptionResolver)

自定义异常处理器需要使用:SimpleMappingExceptionResolver

ExceptionController设置/index的视图控制器。由于我们设置了method = RequestMethod.POST,所以只有请求方式为POST才能跳转到index。html页面,但是uri请求为GET

package com.powernode;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class ExceptionController {
    @RequestMapping(value = "index",method = RequestMethod.POST)
    public String index(){
        return "index";
    }
}

所以打开页面时结果是这样的:

但是我想让这个异常页面设置成我想要的该怎么办?

配置文件方式

SpringMVC架构的配置文件中添加这一部分:

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
            <!--用来指定出现异常后,跳转的视图-->
            <prop key="java.lang.Exception">tip</prop>
        </props>
    </property>
    <!--将异常信息存储到request域,value属性用来指定存储时的key。-->
    <!--底层会执行这样的代码:request.setAttribute("e",异常对象)-->
    <property name="exceptionAttribute" value="e"/>
</bean>

同时tip的页面如下:

<!DOCTYPE html >
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>异常</title>
</head>
<body>
    <h1>出现异常啦,请联系管理员!!</h1>
    <hr>

    <div th:text="${e}"></div>

</body>
</html>

使用xml配置异常处理器时,不能使用<mvc:annotation-driven />
结果:

注解方式


import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class ExceptionController {
    // 异常处理器
    @ExceptionHandler
    public String totip(Exception e, Model model){
        // 将异常信息添加到model中
        model.addAttribute("e",e);
        // 返回tip页面
        return "tip";
    }
}

这种方式同样不能使用<mvc:annotation-driven />
结果:

posted @ 2024-07-11 19:24  BLBALDMAN  阅读(2)  评论(0编辑  收藏  举报