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

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM