springcloud分布式微服务中通用异常的优雅处理方式

1.通常我们在创建父子聚合工程的时候,创建一个common通用微服务继承父工程,然后创建其他微服务来继承comm通用微服务。所以我们只要在common微服务中处理通用异常即可。

具体怎么做呢?

首先在common通用微服务中定义以下几个包,具体如下
在这里插入图片描述
CommonExceptionAdvice.java

package com.leyou.common.advice;

import com.leyou.common.enums.ExceptionEnums;
import com.leyou.common.exception.LyException;
import com.leyou.common.vo.ExceptionResult;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class CommonExceptionAdvice {

    @ExceptionHandler(LyException.class)
    public ResponseEntity<ExceptionResult> exceptionHandle(LyException e){
     //   ExceptionEnums enums = e.getExceptionEnums();
        return ResponseEntity.status(e.getExceptionEnums().getCode()).body(new ExceptionResult(e.getExceptionEnums()));
    }
}

ExceptionEnums.java

package com.leyou.common.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@Getter
public enum ExceptionEnums {

    BEAND_CANNOT_BE_FOND(404,"品牌不存在"),
    SPEC_GROUP_NOT_FOND(404,"商品规格组不存在"),
    SPEC_PARAM_NOT_FOND(404,"商品规格参数不存在"),
    GOODS_NOT_FOND(404,"商品不存在"),
    GOODS_DETAIL_NOT_FOND(404,"商品详情不存在"),
    GOODS_SKU_NOT_FOND(404,"商品的sku不存在"),
    GOODS_STOCK_NOT_FOND(404,"商品的库存不存在"),
    CATEGORY_NOT_BE_FOND(404,"商品分类不存在"),
    BEAND_SAVE_EORRR(500,"商品品牌保存失败"),
    UPLOAD_FILE_EORRR(500,"文件上传失败"),
    INSERT_GOODS_EORRR(500,"新增商品失败"),
    UPDATE_GOODS_EORRR(500,"修改商品失败"),
    FILE_TYPE_NOT_MATCH(400,"无效的文件类型"),
    GOODS_ID_NOT_BE_FON(400,"商品id不能为空"),
    ;
    private int code;
    private String msg;

}

LyException.java

package com.leyou.common.exception;

import com.leyou.common.enums.ExceptionEnums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@Getter
public class LyException extends RuntimeException{

    private ExceptionEnums exceptionEnums;

}

ExceptionResult.java

package com.leyou.common.vo;

import com.leyou.common.enums.ExceptionEnums;
import lombok.Data;

//vo : view object
@Data
public class ExceptionResult {
    private String message;
    private int code;
    private Long timestamp;

    public ExceptionResult(ExceptionEnums enums){
        this.code=enums.getCode();
        this.message=enums.getMsg();
        this.timestamp=System.currentTimeMillis();

    }

}

PageResult.java

package com.leyou.common.vo;

import lombok.Data;

import java.util.List;

@Data
public class PageResult<T> {
    private Long total;//总条数
    private Integer totalPage;//总页数
    private List<T> items;//当前页数据

    public PageResult(){}

    public PageResult(Long total,List<T> items){
        this.total=total;
        this.items=items;
    }
    public PageResult(Long total,Integer totalPage,List<T> items){
        this.total=total;
        this.totalPage=totalPage;
        this.items=items;
    }


}

2.示例代码

2.1、controller层

/**
 * 根据spuid查询下面所有的sku
 * @param id
 * @return
 */
@ApiOperation("根据spuid查询下面所有的sku")
@ApiImplicitParam(name = "id",value = "spu的id",paramType = "Long")
@GetMapping("/sku/list")
public ResponseEntity<List<Sku>> querySkuBySpuid(@RequestParam("id") Long id){
    return ResponseEntity.ok(goodsService.querySkuBySpuid(id));
}

2.2、server层

public List<Sku> querySkuBySpuid(Long spuId) {
      //查询sku
        Sku sku = new Sku();
        sku.setSpuId(spuId);
        List<Sku> skuList = skuMapper.select(sku);
        if(CollectionUtils.isEmpty(skuList)){
            throw new LyException(ExceptionEnums.GOODS_SKU_NOT_FOND);
        }
        //查询库存(方法一)
//        for (Sku s : skuList) {
//            Stock stock = stockMapper.selectByPrimaryKey(s.getSpuId());
//            if(null==stock){
//                throw new LyException(ExceptionEnums.GOODS_STOCK_NOT_FOND);
//            }
//            s.setStock(stock.getStock());
//        }

        //查询库存(方法2)
        List<Long> ids = skuList.stream().map(Sku::getId).collect(Collectors.toList());
        List<Stock> stockList = stockMapper.selectByIdList(ids);
        if(CollectionUtils.isEmpty(stockList)){
            throw new LyException(ExceptionEnums.GOODS_STOCK_NOT_FOND);
        }
        //把stock变成一个map,其中key是skuid,值是库存量
        Map<Long, Long> stockMap = stockList.stream().collect(Collectors.toMap(Stock::getSkuId, Stock::getStock));
        skuList.forEach(s->s.setStock(stockMap.get(s.getId())));
        return skuList;
    }

2.3DAO层

package com.leyou.item.mapper;

import com.leyou.common.mapper.BaseMapper;
import com.leyou.item.pojo.Stock;
import tk.mybatis.mapper.additional.idlist.IdListMapper;
import tk.mybatis.mapper.additional.insert.InsertListMapper;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.sqlserver.InsertMapper;


public interface StockMapper extends BaseMapper<Stock> {


}

BaseMapper.java

package com.leyou.common.mapper;


import tk.mybatis.mapper.additional.idlist.IdListMapper;
import tk.mybatis.mapper.additional.insert.InsertListMapper;
import tk.mybatis.mapper.annotation.RegisterMapper;
import tk.mybatis.mapper.common.Mapper;



@RegisterMapper
public interface BaseMapper<T> extends Mapper<T>, IdListMapper<T,Long>, InsertListMapper<T> {
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值