SpringMVC全局异常配置

本文介绍了一种在Spring框架中实现的统一异常处理机制,通过自定义的MyExceptionResolver类,可以有效地捕获并处理各种异常,包括BindException、MethodArgumentNotValidException和ConstraintViolationException等,确保了API响应的一致性和用户体验。

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

代码如下:
package com.ghgcn.support.web;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;

import org.jflame.toolkit.common.bean.CallResult;
import org.jflame.toolkit.common.bean.CallResult.ResultEnum;
import org.jflame.web.util.WebUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;

/**

  • 统一异常处理类

  • @author zyc
    */
    @SuppressWarnings(“rawtypes”)
    public class MyExceptionResolver extends SimpleMappingExceptionResolver {

    private final CallResult err_json = new CallResult(ResultEnum.SERVER_ERROR);
    private final Logger log = LoggerFactory.getLogger(MyExceptionResolver.class);

    public MyExceptionResolver() {
    }

    @Override
    protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
    Exception ex) {
    String viewName = determineViewName(ex, request);
    if (viewName != null) {
    Integer statusCode = determineStatusCode(request, viewName);
    if (statusCode != null) {
    applyStatusCodeIfPossible(request, response, statusCode);
    }
    }
    // 请求方法未使用BindingResult保存验证结果时,将抛出BindException异常,由此处统一处理
    if (ex instanceof BindException || ex instanceof MethodArgumentNotValidException) {
    log.error(ex.getMessage());// 参数异常只记录信息,不记录大量异常堆栈
    BindException validEx = (BindException) ex;
    if (validEx.hasFieldErrors()) {
    if (jsonResult(request, handler)) {
    CallResult errResult = new CallResult();
    BaseController.convertError(validEx.getBindingResult(), errResult);
    outJson(response, errResult);
    return null;
    } else {
    ((WebRequest) request).setAttribute(“fieldErrors”, validEx.getFieldErrors(),
    WebRequest.SCOPE_REQUEST);
    }
    }
    } else {
    if (jsonResult(request, handler)) {
    if (ex.getCause() instanceof ConstraintViolationException) {
    ConstraintViolationException cve = (ConstraintViolationException) ex.getCause();
    String errMsg = “”;
    for (ConstraintViolation cv : cve.getConstraintViolations()) {
    errMsg = errMsg + cv.getMessage() + “;”;
    }
    log.error(errMsg);
    outJson(response, CallResult.paramError(errMsg));
    } else {
    log.error("", ex);
    outJson(response, err_json);
    }
    return null;
    }
    log.error("", ex);
    }

     return viewName != null ? getModelAndView(viewName, ex, request) : null;
    

    }

    void outJson(HttpServletResponse response, CallResult json) {
    try {
    WebUtils.outJson(response, json);
    } catch (IOException e) {
    log.error("", e);
    }
    }

    public static boolean jsonResult(HttpServletRequest request, Object handler) {
    if (handler != null && handler instanceof HandlerMethod) {
    HandlerMethod handlerMethod = (HandlerMethod) handler;
    if (handlerMethod.getMethodAnnotation(ResponseBody.class) != null || handlerMethod.getBeanType()
    .getAnnotation(RestController.class) != null) {
    return true;
    }
    }
    if (WebUtils.isJsonRequest(request) || WebUtils.isAjaxRequest(request)) {
    return true;
    }
    return false;
    }
    }
    spring-mvc.xml配置bean如下:

<bean id="exceptionResolver" class="com.ghgcn.support.web.MyExceptionResolver">
	<property name="defaultErrorView" value="/common/error" />
	<property name="exceptionMappings">
		<props>
			<prop key="java.lang.Exception">/common/error</prop>
		</props>
	</property>
	<property name="order" value="0"></property>
</bean>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值