文档章节

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

似水流年0_0
 似水流年0_0
发布于 2016/07/18 11:32
字数 386
阅读 2594
收藏 3

首先我的项目是一个为移动端提供的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"
}

 

© 著作权归作者所有

共有 人打赏支持
似水流年0_0
粉丝 55
博文 79
码字总数 51471
作品 0
长宁
高级程序员
加载中

评论(3)

王静0716
王静0716
感谢楼主,我说为什么我的不行,一语惊醒梦中人,“注意这个类是在controller包下面”
似水流年0_0
似水流年0_0

引用来自“zhang555”的评论

我也要跟着学后台
29
zhang555
zhang555
我也要跟着学后台
spring mvc 统一异常处理

1、定义一个统一异常处理类 @ControllerAdvice,是spring3.2提供的新注解, 一般扫描context:component-scan扫描时也能扫描到,不需要在配置文件配置 但如果你的spring-mvc配置文件使用如下方...

qiun
2016/06/24
308
0
Spring实践--@ControllerAdvice 全局处理异常 

零、前言 对于与数据库相关的 Spring MVC 项目,我们通常会把 事务 配置在 Service层,当数据库操作失败时让 Service 层抛出运行时异常,Spring 事物管理器就会进行回滚。 如此一来,我们的 ...

spinachgit
2017/11/21
0
0
记一次Controller改造,及SpringMVC处理流程

概述 由于工作需要,需实现这样一个功能的controller框架: 1,Restful API 2,请求参数校验(请求中需要携带指定的参数,才能进入控制器方法。一次请求会携带一些基本信息,以及请求数据,此...

iiron
昨天
0
0
springboot + shiro 权限注解、请求乱码解决、统一异常处理

springboot + shiro 权限注解、请求乱码解决、统一异常处理 前篇 后台权限管理系统 相关: spring boot + mybatis + layui + shiro后台权限管理系统 springboot + shiro之登录人数限制、登录...

wyait
06/06
0
0
SpringBoot RESTful 应用中的异常处理小结

@ControllerAdvice 和 @ExceptionHandler 的区别 ExceptionHandler, 方法注解, 作用于 Controller 级别. ExceptionHandler 注解为一个 Controler 定义一个异常处理器. ControllerAdvice, 类注......

xiaogong1688
06/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

android webrtc使用opensl es

1. java层开启开关 peerConnectionParameters = new PeerConnectionClient.PeerConnectionParameters(); 接口中的useOpensles参数设置为true 2. /system/etc/permissions/下新增and......

bill_shen
18分钟前
0
0
读《高性能mysql》记录

1 2

李佳顺
19分钟前
0
0
Element UI框架+Vue开发搭建示例

一、关于Element 1.Element,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库,官方网址:http://element-cn.eleme.io/#/zh-CN 2.Element UI 是饿了么前端团队倾情打造htt...

tianma3798
21分钟前
2
0
Fragment整理

1、Fragment父类 Fragment的父类有两个,分别为android.app.Fragment和android.support.v4.app.Fragment。建议使用android.support.v4.app.Fragment。因为此Fragment在所有的android版本中可...

西米小娅
27分钟前
0
0
mysql报错:所选列未在GROUP BY子句中 的解决方法(laravel框架)

数据库配置文件database.php文件的 'mysql' => [ 'strict' => false] strict改为false,应该是开启宽松模式,就不会报错了...

郭周园
31分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部