文档章节

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

似水流年0_0
 似水流年0_0
发布于 2016/07/18 11:32
字数 386
阅读 3182
收藏 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
粉丝 58
博文 83
码字总数 55847
作品 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
2018/09/25
0
0
@ControllerAdvice 拦截异常并统一处理

在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。 一、介绍 创建 MyControllerAdvice,并添...

狼王黄师傅
2018/10/16
0
0
springboot + shiro 权限注解、请求乱码解决、统一异常处理

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

wyait
2018/06/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux syslog相关函数详解

介绍 syslog是Unix系统的日志系统。可以将日志记录在本地系统中。 一个完整的syslong日志包含如下信息:程序模块 | 严重性 | 时间 | 主机名 | 进程名 | 进程ID | 正文。 syslong相关函数 1....

RongJinhui0
13分钟前
0
0
使用nsenter工具进入Docker容器

查看本机装没有nsenter whereis nsenter或者whatis nsenter 未安装先安装,网上有很多这样的脚本 vi nsenter.sh#!/bin/bashcurl https://www.kernel.org/pub/linux/utils/util-linux/v2....

问题终结者
13分钟前
1
0
MaxCompute安全管理指南-基础篇

背景及目的 方便和辅助MaxCompute的project owner或安全管理员进行project的日常安全运维,保障数据安全。 MaxCompute有安全模型,DataWorks也有安全模型,当通过DataWorks使用MaxCompute,而...

阿里云云栖社区
14分钟前
0
0
Retrofit设计模式源码解析

因为Retrofit做到了很强的解耦,因此就一定需要用到很多设计模式。所以,我觉得,通过阅读Retrofit源码来学习设计模式是再好不过的设计模式学习方法了。 大致看了一圈Retrofit源码,受益匪浅...

亭子happy
14分钟前
3
0
哈夫曼编码

哈夫曼编码的基本思想是以字符的使用频率作为权构建一颗哈夫曼树,然后利用 哈夫曼树对字符进行编码 哈夫曼算法采用的贪心策略是每次从树的集合中取出没有双亲权值最小的两棵作为左右子树, ...

writeademo
16分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部