spring mvc异常统一处理(ControllerAdvice注解)
spring mvc异常统一处理(ControllerAdvice注解)
似水流年0_0 发表于1年前
spring mvc异常统一处理(ControllerAdvice注解)
  • 发表于 1年前
  • 阅读 1512
  • 收藏 3
  • 点赞 2
  • 评论 3

腾讯云 技术升级10大核心产品年终让利>>>   

首先我的项目是一个为移动端提供的json数据的,当后台报错时如果为移动端返回一个错误页面显得非常不友好,于是通过ControllerAdvice注解返回json数据。

首先创建一个异常处理类:

package com.gefufeng.controller;

import com.gefufeng.common.exception.KnownBizException;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.http.HttpStatus;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by gefufeng on 16/7/18.
 */
@ControllerAdvice
public class ApplicationControllerExceptionHandler {
    private static final Logger LOGGER = LogManager.getLogger(ApplicationControllerExceptionHandler.class);

    @ExceptionHandler(value = Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public Map<String, Object> handlerError(HttpServletRequest req, Exception e) {
        map.put("tip", "此错误说明调用接口失败,失败原因见msg,如果msg为空,联系后台");
        map.put("msg", msg);
        map.put("path", req.getRequestURI());
        map.put("params", req.getParameterMap());
        map.put("status", "0");
        return map;
    }
}

加上ControllerAdvice注解,注意这个类是在controller包下面,因为spring需要扫描到,

代码中的:

@ExceptionHandler(value = Exception.class)

表示捕捉到所有的异常,你也可以捕捉一个你自定义的异常,比如:

    @ExceptionHandler(BusinessException.class)  
    @ResponseBody//这里加上这个注解才能返回json数据 
    public void handleBizExp(HttpServletRequest request, Exception ex){  

    }  
      
    @ExceptionHandler(SQLException.class)  
    public ModelAndView handSql(Exception ex){   
        ModelAndView mv = new ModelAndView();  
        return mv;  
    }  

然后我在一个接口中故意抛出一个异常:

@RestController
@RequestMapping(value = "/customer",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public class CustomerController extends BaseController{
    @Autowired
    CustomerService customerService;

    @RequestMapping(value = "/getcustomer",method = RequestMethod.GET)
    public String getCustomer(){
        logger.info(EnvironmentUtils.isTest());
        List<Customer> customers = customerService.getCustomerList();
        throw new KnownBizException("已知的异常");
    }
}

最后后台返回的数据是:

{
  "msg": "已知的异常",
  "path": "/myschool/customer/getcustomer",
  "tip": "此错误说明调用接口失败,失败原因见msg,如果msg为空,联系后台",
  "params": {},
  "status": "0"
}

 

共有 人打赏支持
粉丝 56
博文 76
码字总数 50646
评论 (3)
zhang555
我也要跟着学后台
似水流年0_0

引用来自“zhang555”的评论

我也要跟着学后台
29
王静0716
感谢楼主,我说为什么我的不行,一语惊醒梦中人,“注意这个类是在controller包下面”
×
似水流年0_0
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: