学习笔记(二)、 Spring Boot中使用全局异常处理器

现在的开发模式倾向于前后端分离,当服务器或业务服务出现异常时,后端开发人员要友好的返回对应的错误代码和异常信息给前端,本文针对上节的代码进行整改。

上篇笔记:https://blog.csdn.net/wdg2333/article/details/86764380

一、自定义业务异常 BussinessException.java:

package com.wdg.springdatajpademo.exception;

/**
 * @author WDG
 * 自定义异常
 * @date 2019-2-5
 */
public class BussinessException extends  Exception {


    private int errCode;//错误代码
    private String errMessage;//错误信息

    public BussinessException(int errCode, String errMessage) {
        this.errCode = errCode;
        this.errMessage = errMessage;
    }

    public int getErrCode() {
        return errCode;
    }

    public void setErrCode(int errCode) {
        this.errCode = errCode;
    }


    public String getErrMessage() {
        return errMessage;
    }


    public BussinessException() {

    }

}

二、自定义通用返回码实体类,分页结果实体类,通用信息返回实体类:

ReturnCode.java:

package com.wdg.springdatajpademo.common;

/**
 * @author WDG
 * @date 2019-2-5
 * 返回码定义实体类
 */
public class ReturnCode {

    public static final int DEFAULT_ERROR = 10000;//默认错误返回码


    public static final int DEFAULT_SUCESS = 11000;//默认成功返回码

    //自定义2开头为用户服务返回码
    public static final int USER_OPTION_SUCESS = 20001;//用户请求成功返回码

    public static final int NO_PERMISSION = 30001;//没有操作权限

}

PageResult.java:

package com.wdg.springdatajpademo.common;

/**
 * @author WDG
 * 分页返回结果实体类
 * @date 2019-2-5
 */
public class PageResult {

    private long total;//总记录数
    private int totalPage;//查询总页数
    private Object data;//结果集

    public PageResult(long total, int totalPage, Object data) {
        this.total = total;
        this.totalPage = totalPage;
        this.data = data;
    }

    public long getTotal() {
        return total;
    }

    public void setTotal(long total) {
        this.total = total;
    }

    public int getTotalPage() {
        return totalPage;
    }

    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

CommonReturnType.java:

package com.wdg.springdatajpademo.common;

/**
 * @author WDG
 * 通用结果返回实体类
 * @date 2019-2-5
 */
public class CommonReturnType {

    private int code;//返回代码
    private String message;//结果信息
    private Object data;//结果集

    public CommonReturnType(int code, String message, Object data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    public CommonReturnType(int code, String message) {
        this.code = code;
        this.message = message;
        this.data = null;
    }
    public CommonReturnType() {

    }
    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

三、全局异常处理器:用到两个注解

@ControllerAdvice、@ExceptionHandler(Exception.class) 可以作用于类上也可以作用于某个方法上

BaseControllerException.java:

package com.wdg.springdatajpademo.controller;

import com.wdg.springdatajpademo.common.CommonReturnType;
import com.wdg.springdatajpademo.common.ReturnCode;
import com.wdg.springdatajpademo.exception.BussinessException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;


/**
 * @author WDG
 * @date 2019-2-5
 */
@ControllerAdvice
public class BaseControllerException {

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public CommonReturnType doExcetion(Exception e){

        //判断是否是自定义的业务异常
        if(e instanceof BussinessException){
            BussinessException exception = (BussinessException) e;
            return  new CommonReturnType(exception.getErrCode(),exception.getErrMessage());
        }else{
            //服务器错误
            return  new CommonReturnType(ReturnCode.DEFAULT_ERROR,"未知错误");
        }
    }
}

UserController.java:

package com.wdg.springdatajpademo.controller;

import com.wdg.springdatajpademo.common.CommonReturnType;
import com.wdg.springdatajpademo.common.PageResult;
import com.wdg.springdatajpademo.common.ReturnCode;
import com.wdg.springdatajpademo.pojo.User;
import com.wdg.springdatajpademo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;





/**
 * @author WDG
 * @date 2019-2-4
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 分页查询
     * @param page
     * @param size
     * @return
     */
    @GetMapping("/page/{page}/{size}")
    public CommonReturnType findByPage(@PathVariable Integer page,@PathVariable Integer size){
        Page<User> pageResult = userService.findByPage(page, size);
        return new CommonReturnType(ReturnCode.DEFAULT_SUCESS,"查询成功",
                new PageResult(pageResult.getTotalElements(),pageResult.getTotalPages(),pageResult.getContent()));
    }

    /**
     * id查询用户
     * @param userId
     * @return
     */
    @GetMapping("/{userId}")
    public CommonReturnType findByUserId(@PathVariable Integer userId){
        int i = 1/0;
        return new CommonReturnType(ReturnCode.DEFAULT_SUCESS,"查询成功",userService.findById(userId));

    }
    /**
     * 注册用户
     * @param user
     * @return
     */
    @PostMapping("/addUser")
    public CommonReturnType addUser(@RequestBody User user){
           userService.addUser(user);
           return  new CommonReturnType(ReturnCode.USER_OPTION_SUCESS,"注册成功");

    }

    /**
     * 分页+条件查询
     * @param page
     * @param size
     * @param user
     * @return
     */
    @PostMapping("/pageandselect/{page}/{size}")
    public CommonReturnType findByPageAndSelect(@PathVariable Integer page,
                                          @PathVariable Integer size,
                                          @RequestBody  User user){
        Page<User> pageResult = userService.findByPageAndSelect(page, size, user);
        return new CommonReturnType(ReturnCode.DEFAULT_SUCESS,"查询成功",
                new PageResult(pageResult.getTotalElements(),pageResult.getTotalPages(),pageResult.getContent()));
    }
    /**
     * 修改用户
     * @param user
     * @return
     */
    @PutMapping("/updateUser")
    public CommonReturnType updateUser(@RequestBody  User user){
        userService.updateUser(user);
        return  new CommonReturnType(ReturnCode.USER_OPTION_SUCESS,"修改成功");
    }
    /**
     * 删除用户
     * @param userId
     * @return
     */
    @DeleteMapping("/deleteUser/{userId}")
    public CommonReturnType deleteUser(@PathVariable  Integer userId,String role) throws Exception{
       userService.deleteUser(userId,role);
        return  new CommonReturnType(ReturnCode.USER_OPTION_SUCESS,"删除成功");
    }
    /**
     * 根据用户名修改用户
     * @param user
     * @return
     */
    @PutMapping("/updateUserByName")
    public CommonReturnType updateUserByName(@RequestBody  User user){
         userService.updateUserByName(user);
         return  new CommonReturnType(ReturnCode.USER_OPTION_SUCESS,"修改成功");

    }
    /**
     * 根据年龄查询用户信息
     * @param age
     * @return
     */
    @GetMapping("/findUserByAge/{age}")
    public CommonReturnType findUserByAge(@PathVariable  Integer age){
        return new CommonReturnType(ReturnCode.DEFAULT_SUCESS,"查询成功",userService.findUserByAge(age));
    }
}

UserService.java 部分代码:

 /**
     * 删除用户
     * @param userId
     */
    public void deleteUser(int userId,String role) throws  Exception{
        //删除用户通常需要超级管理员权限+token验证机制,这边简单判断
        if(role !=null && role.equals("admin")){
            //是管理员操作
            userRepository.deleteById(userId);
        }else {
            throw new BussinessException(ReturnCode.NO_PERMISSION,"无权操作");
        }

    }

四、postman进行测试

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值