zoukankan      html  css  js  c++  java
  • spring mvc异常统一处理(ControllerAdvice注解)

     

    首先我的项目是一个为移动端提供的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"
    }
     
  • 相关阅读:
    数学+高精度 ZOJ 2313 Chinese Girls' Amusement
    最短路(Bellman_Ford) POJ 1860 Currency Exchange
    贪心 Gym 100502E Opening Ceremony
    概率 Gym 100502D Dice Game
    判断 Gym 100502K Train Passengers
    BFS POJ 3278 Catch That Cow
    DFS POJ 2362 Square
    DFS ZOJ 1002/HDOJ 1045 Fire Net
    组合数学(全排列)+DFS CSU 1563 Lexicography
    stack UVA 442 Matrix Chain Multiplication
  • 原文地址:https://www.cnblogs.com/hujihon/p/6188064.html
Copyright © 2011-2022 走看看