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> {
}