全局数据返回及异常处理

1.全局数据返回

可以定义一个hashmap类,结构类似下图这样,1.状态码,2.信息,3.数据域
在这里插入图片描述
工具类:

/**
 * @Author: lzp
 * @Description: 统一返回的工具类
 * @Date Create in 13:26 2022/04/06
 * @Modified By:
 */
public class R extends HashMap<String, Object> {
	private static final long serialVersionUID = 1L;
	//存元素 和setData的区别是 这个方法可以指定key的值
	public R put(String key, Object value) {
		super.put(key, value);
		return this;

	}

	public R setData(Object data) {
		put("data",data);
		return this;
	}

	//远程调用服务时,另一个服务也会返回R类型的数据,这个方法可以获取key为data的value值
	//利用fastjson进行反序列化
	public <T> T getData(TypeReference<T> typeReference) {
		Object data = get("data");	//默认是map
		String jsonString = JSON.toJSONString(data);//转为json字符串
		T t = JSON.parseObject(jsonString, typeReference);//转为对象
		return t;
	}
	//利用fastjson进行反序列化
	public <T> T getData(String key,TypeReference<T> typeReference) {
		Object data = get(key);	//默认是map
		//转为json字符串
		String jsonString = JSON.toJSONString(data);//转为json字符串
		//转成需要的对象
		T t = JSON.parseObject(jsonString, typeReference);//转为对象
		return t;
	}
	public static long getSerialVersionUID() {
		return serialVersionUID;
	}

	//无参构造
	public R() {
		put("code", 0);
		put("msg", "success");
	}

	//返回错误码500的错误,错误内容:未知异常,请联系管理员
	public static R error() {
		return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "未知异常,请联系管理员");
	}
	//返回错误码500的错误,错误内容需要自己传入
	public static R error(String msg) {
		return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg);
	}
	//返回自定义错误码,自定义错误内容
	public static R error(int code, String msg) {
		R r = new R();
		r.put("code", code);
		r.put("msg", msg);
		return r;
	}

	//返回正常,内容需要自己传入
	public static R ok(String msg) {
		R r = new R();
		r.put("msg", msg);
		return r;
	}
	//存入多条返回消息
	public static R ok(Map<String, Object> map) {
		R r = new R();
		r.putAll(map);
		return r;
	}

	//默认返回 0 success
	public static R ok() {
		return new R();
	}

	//获取code(状态码)的值
    public Integer getCode() {
		return (Integer) this.get("code");
    }
}

使用:
1.return R.ok().setData(spuInfoEntity);

    /**
     * @Author: lzp
     * @Description: 根据skuId查询spu的信息
     * @Date Create in 13:43 2022/4/6
     * @Param: skuId
     * @Return: R
     * @Modified By:
     */
    @GetMapping(value = "/skuId/{skuId}")
    public R getSpuInfoBySkuId(@PathVariable("skuId") Long skuId) {

        SpuInfoEntity spuInfoEntity = spuInfoService.getSpuInfoBySkuId(skuId);

        return R.ok().setData(spuInfoEntity);
    }

返回数据
在这里插入图片描述
2.return R.ok().put(“page”, page); (可以自定义key)

    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params){
        PageUtils page = attrService.queryPage(params);

        return R.ok().put("page", page);
    }

返回数据:
在这里插入图片描述

2.全局异常处理

自定义异常类

/**
 * @Author: lzp
 * @Description:
 * @Date Create in 13:56 2022/04/06
 * @Modified By:
 */
public class PhoneException extends RuntimeException {

    public PhoneException(String msg) {
        super(msg);
    }
}

不满足条件可以抛出异常
在这里插入图片描述
然后可以通过catch捕获异常 捕获到异常返回R.error()+自定义错误信息和错误码
在这里插入图片描述

全局异常
自定义全局异常处理器:

/**
 * @Author: lzp
 * @Description: 全局异常处理
 * @Date Create in 14:05 2022/04/06
 * @Modified By:
 */


@Slf4j
@RestControllerAdvice(basePackages = "com.atguigu.gulimall.gulimallproduct.controller")//指定路径
public class GulimallExceptionControllerAdvice {
    //加此注解捕获异常 异常类型:MethodArgumentNotValidException
    @ExceptionHandler(value= MethodArgumentNotValidException.class)
    public R handleVaildException(MethodArgumentNotValidException e){
        log.error("数据校验出现问题{},异常类型:{}",e.getMessage(),e.getClass());
        BindingResult bindingResult = e.getBindingResult();

        Map<String,String> errorMap = new HashMap<>();
        bindingResult.getFieldErrors().forEach((fieldError)->{
            errorMap.put(fieldError.getField(),fieldError.getDefaultMessage());
        });
        return R.error(BizCodeEnume.VAILD_EXCEPTION.getCode(),BizCodeEnume.VAILD_EXCEPTION.getMsg()).put("data",errorMap);
    }
    //其他的异常由这个处理
    @ExceptionHandler(value = Throwable.class)
    public R handleException(Throwable throwable){

        log.error("错误:",throwable);
        return R.error(BizCodeEnume.UNKNOW_EXCEPTION.getCode(),BizCodeEnume.UNKNOW_EXCEPTION.getMsg());
    }
}

在这里插入图片描述
@Order(Ordered.HIGHEST_PRECEDENCE) 可以提高异常处理类的加载顺序

用这种方法就不需要catch来捕获异常了,业务中直接抛出即可,异常统一在这个类中处理

针对返回的错误信息,可以自定义一个枚举类,指定状态码和错误信息

/**
 * @Author: lzp
 * @Description: 枚举类 指定错误状态码和错误信息
 * @Date Create in 14:55 2022/04/06
 * @Modified By:
 */
public enum BizCodeEnume {
    UNKNOW_EXCEPTION(10000,"系统未知异常"),
    PRODUCT_UP_EXCEPTION(11000,"商品上架异常"),
    TO_MANY_REQUEST(10002,"请求流量过大,请稍后再试"),
    SMS_CODE_EXCEPTION(10002,"验证码获取频率太高,请稍后再试"),
    USER_EXIST_EXCEPTION(15001,"存在相同的用户"),
    PHONE_EXIST_EXCEPTION(15002,"存在相同的手机号"),
    LOGINACCT_PASSWORD_EXCEPTION(15003,"账号或密码错误"),
    NO_STOCK_EXCEPTION(21000,"商品库存不足"),
    VAILD_EXCEPTION(10001,"参数格式校验失败");

    private int code;
    private String msg;
    BizCodeEnume(int code, String msg){
        this.code = code;
        this.msg = msg;
    }

    public int getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值