springboot(17)统一异常处理

使用Spring Boot统一处理异常。

本文实例是从数据库中根据ID查询学生信息,要求学生的年龄在14——20岁之间。小于14岁,提示“你可能在上初中”;大于20岁,提示“呢可能在上大学”。

第一步,创建枚举类ResultEnum,用来管理异常信息

package *;//自己定义
public enum ResultEnum {
    UNKONW_ERROR(-1, "未知错误"),
    SUCCESS(0, "成功"),
    PRIMARY_SCHOOL(100, "年龄小于14岁,可能正在上中学"),
    UNIVERSITY(101, "年龄大于20岁,可能正在上大学");
    private Integer code;
    private String msg;
    ResultEnum( Integer code, String msg){
        this.code = code;
        this.msg = msg;
    }
    public Integer getCode(){
        return  this.code;
    }
    public String getMsg(){
        return this.msg;
    }
}

第二步,创建自己的异常类StudentException,代码如下:

package *;//自己定义
import *.ResultEnum; //自己定义路径
public class StudentException extends RuntimeException {
    private Integer code;
    public StudentException(ResultEnum resultEnum){
        super(resultEnum.getMsg());
        this.code = resultEnum.getCode();
    }
    public void setCode(Integer code) {
        this.code = code;
    }
    public Integer getCode() {
        return code;
    }
}

第三步,创建返回报文实体类Result.java

package *;//自己定义
import *.Result; //自己定义的路径
/**
 * HTTP请求返回处理工具类
 */
public class ResultUtil {
    public static Result success(){
        return success(null);
    }
    public static Result success(Object object){
        Result result = new Result();
        result.setCode(0);
        result.setMsg("成功");
        result.setDate(object);
        return result;
    }
    public static Result error(Integer code, String msg){
        Result result = new Result();
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }
}

第四步,创建请求返回工具类ResultUtil.java

package *;//自己定义
import *.Result;//自己定义的路径
/**
 * HTTP请求返回处理工具类
 */
public class ResultUtil {
    public static Result success(){
        return success(null);
    }
    public static Result success(Object object){
        Result result = new Result();
        result.setCode(0);
        result.setMsg("成功");
        result.setDate(object);
        return result;
    }
    public static Result error(Integer code, String msg){
        Result result = new Result();
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }
}

第五步,创建统一处理异常的类ExceptionHandle.java,代码如下:

package *; //自己定义
import *.StudentException; //自己定义路径
import *.Result; //自己定义路径
import *.ResultUtil; //自己定义路径
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@ControllerAdvice
public class ExceptionHandle {
    private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Result handler( Exception e){
        if( e instanceof StudentException){
            StudentException studentException = (StudentException) e;
            return ResultUtil.error( studentException.getCode(), studentException.getMessage());
        }else {
            logger.info("[系统异常] {}",e);
            return ResultUtil.error( -1, "未知错误");
        }
    }
}

第六步,在service中编写业务逻辑代码:

package *; //自己定义
import *.ResultEnum; //自己定义的路径
import *.StudentException; //自己定义的路径
import *.StudentRepository; //自己定义的路径
import *.Student; //自己定义的路径
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
@Service
public class StudentService {
    @Autowired
    private StudentRepository studentRepository;
    /**
     * 根据ID查询符合条件的学生
     * @param id
     * @throws Exception
     */
    public Student getStudentById( Integer id) throws Exception{
        Student student = studentRepository.findOne(id);
        Integer age = student.getAge();
        if(age < 14){
            throw new StudentException(ResultEnum.PRIMARY_SCHOOL);
        }else if(age > 20){
            throw new StudentException(ResultEnum.UNIVERSITY);
        }
        //进行下面逻辑操作
        return student;
    }
}

第七步,在controller中调用service方法,代码如下:

package *; //自己定义路径
import *.Result; //自己定义路径
import *.StudentService; //自己定义路径
import *.ResultUtil; //自己定义路径
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
@RestController
public class StudentController {
    @Autowired
    private StudentService studentService;
    /**
     * 根据ID查询学生
     */
    @GetMapping(value = "/student/getage/{id}")
    public Result getStudentById(@PathVariable("id") Integer id) throws Exception{
        return ResultUtil.success(studentService.getStudentById(id));
    }
}

最后,使用postman访问http://127.0.0.1:8080/student/getage/1 ,查看结果。

原文发布于微信公众号 - 编程坑太多(idig88)

原文发表时间:2018-04-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Spring相关

第11章—使用对象关系映射持久化数据—SpringBoot+SpringData+Jpa进行查询修改数据库

JPA由EJB 3.0软件专家组开发,作为JSR-220实现的一部分。但它又不限于EJB 3.0,你可以在Web应用、甚至桌面应用中使用。JPA的宗旨是为POJ...

1033
来自专栏后端之路

JMockit原理剖析

上篇文章描述了Jmockit的最基本的也是最方便也是最神奇的mock神技单元测试JMockit使用 本篇大概就其原理好好说道。 背景知识 Instrumenta...

6859
来自专栏技术小黑屋

谁来检查方法参数合法性

我们在编程中的函数或者是方法,大多数都是有参数的。参数对于方法来说是很重要的输入数据,传入的参数值的合法性影响着方法的稳定性,严重时甚至可能导致崩溃问题的出现。

892
来自专栏世界第一语言是java

java根据ip地址获取城市地域信息

2955
来自专栏Ryan Miao

SpringMVC参数校验(针对`@RequestBody`返回`400`)

SpringMVC参数校验(针对@RequestBody返回400) From https://ryan-miao.github.io/2017/05/20/s...

4894
来自专栏osc同步分享

springmvc 其他

<!-- 配置直接转发的页面 --> <!-- 可以直接相应转发的页面, 而无需再经过 Handler 的方法. --> <mvc:view-contr...

3538
来自专栏别先生

Spring的核心之IoC容器创建对象

Spring的Ioc容器,是Spring的核心内容:   作用:对象的创建和处理对象的依赖关系。 Spring容器创建对象有以下几种方式:   1:调...

2145
来自专栏码匠的流水账

聊聊kafka consumer offset lag的监控

在0.8.2.2版本如下 kafka_2.10-0.8.2.2-sources.jar!/kafka/tools/ConsumerOffsetChecker.s...

2611
来自专栏SpringBoot

springboot2 启动后执行代码

1252
来自专栏GopherCoder

『Go 内置库第一季:json』

在日常开发过程中,使用最频繁的当然是内置库,无数的开源项目,无不是在内置库的基础之上进行衍生、开发,所以其实是有很大的必要进行梳理学习。

952

扫码关注云+社区