您的位置:首页 > 编程语言 > Java开发

spring mvc异常统一处理(ControllerAdvice注解)

2016-07-18 17:56 489 查看
首先我的项目是一个为移动端提供的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"
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息