admin-component异常处理机制

本文详细介绍了Spring框架下的全局异常处理机制,包括两种实现方式:XML配置和注解。通过自定义异常处理类和方法,可以统一处理各种异常,提高代码的健壮性和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、异常处理机制

系统的各个地方可能抛出异常,而不同地方抛出的相同异常它们的处理方式也可能是相同的,那么重复的去实现异常处理就太费劲了,因此需要建立一个全局范围的异常处理机制。

2、实现方式

在Spring框架下实现异常处理机制有两种方式,一种是用xml配置的方式,一种是用注解的方式。

i、xml配置

在SpringMVC的配置文件上,加上如下的Bean:

<!-- 配置基于XML的异常机制 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" id="simpleMappingExceptionResolver">
    <!-- 配置异常类型和具体视图页面的对应关系 -->
    <property name="exceptionMappings">
        <props>
            <prop key="java.lang.Exception">system-error</prop>
            <prop key="com.alageek.crowd.exception.AccessForbiddenException">admin-login</prop>
        </props>
    </property>
</bean>

上面已经添加了两个异常处理,一个是自定义异常访问禁止异常,系统捕获到该异常后,将会跳转页面到登录页面admin-login,该异常一般由拦截器抛出;第二个异常处理是Exception异常,该异常对应跳到system-error页面。

ii、注解

全局异常处理需要用到两个注解,一个是@ControllerAdvice,放在类前,表示当前类是基于注解的异常处理类;另一个是@ExceptionHandler,放在方法前,将具体的异常类与方法关联。代码如下:

/**
 * 异常处理机制
 * @author alageek
 * 注解ControllerAdvice表示当前类是基于注解的异常处理器类
 */
@ControllerAdvice
public class CrowdExceptionResolver {

    /**
     * 禁止访问异常处理
     * 注解ExceptionHandler将异常类与方法关联
     * @param exception 异常对象
     * @param request   请求对象
     * @param response  响应对象
     * @return 若请求为Ajax请求,则返回json类型的错误信息,否则返回错误页面
     * @throws IOException ResultEntity对象转json异常
     */
    @ExceptionHandler(value = AccessForbiddenException.class)
    public ModelAndView resolveAccessForbiddenException(
            AccessForbiddenException exception,
            HttpServletRequest request,
            HttpServletResponse response) throws IOException {
        String viewName = "admin-login";
        return commonResolve(exception, request, response, viewName);
    }

    /**
     * 其他失败异常处理
     * 注解ExceptionHandler将异常类与方法关联
     * @param exception 异常对象
     * @param request   请求对象
     * @param response  响应对象
     * @return 若请求为Ajax请求,则返回json类型的错误信息,否则返回错误页面
     * @throws IOException ResultEntity对象转json异常
     */
    @ExceptionHandler(value = Exception.class)
    public ModelAndView resolveException(
            Exception exception,
            HttpServletRequest request,
            HttpServletResponse response ) throws IOException {
        String viewName = "system-error";
        return commonResolve(exception, request, response, viewName);
    }

    private ModelAndView commonResolve(
            Exception exception,
            HttpServletRequest request,
            HttpServletResponse response,
            String viewName) throws IOException {
        if(CrowdUtil.judgeRequestType(request)){
            // Ajax请求
            response.getWriter().write(new Gson().toJson(ResultEntity.failed(exception.getMessage())));
            return null;
        }
        // 普通请求
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject(CrowdConstant.ATTR_NAME_EXCEPTION, exception);
        modelAndView.setViewName(viewName);
        return modelAndView;
    }

}

上述代码以访问禁止异常与其他异常为例,由于捕获到异常后的动作都是跳转页面,因此可以将共同操作抽象出来,写成一个方法commonResolve。


以上就是Spring中的全局异常处理机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值