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"
}

 

發佈了83 篇原創文章 · 獲贊 3 · 訪問量 4562
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章