电商项目专题(五)-通用的的异常处理
1.场景预设1.1.场景加入我们做新增商品需要接收下面的参数price价格 name名称然后对数据做简单校验价格不能为空新增时自动生成 ID 然后随商品对象一起返回1.2.代码实现项目结构实体类packagecom.yigou.item.pojo;importlombok.AllArgsConstructor;importlombok.Data;importlombok.NoArgsConstructor;/** * author bruceliu * create 2019-09-01 12:36 * description */DataNoArgsConstructorAllArgsConstructorpublicclassItem{privateInteger id;privateString name;privateLong price;}servicepackagecom.yigou.item.service;importcom.yigou.item.pojo.Item;importorg.springframework.stereotype.Service;importjava.util.Random;/** * author bruceliu * create 2019-09-03 22:12 * description */ServicepublicclassItemService{publicItemsaveItem(Item item){// 商品新增intidnewRandom().nextInt(100);item.setId(id);returnitem;}}controllerpackagecom.yigou.item.controller;importcom.yigou.item.pojo.Item;importjava.util.List;importcom.yigou.item.service.ItemService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.http.HttpStatus;importorg.springframework.http.ResponseEntity;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;/** * author bruceliu * create 2019-09-01 12:38 * description */RestControllerRequestMapping(item)publicclassItemController{AutowiredprivateItemService itemService;PostMappingpublicResponseEntityItemsaveItem(Item item){// 校验商品的价格if(item.getPrice()null){returnResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);}Item item1itemService.saveItem(item);returnResponseEntity.status(HttpStatus.CREATED).body(item1);}}测试如果price为空改写Controller给出异常消息packagecom.yigou.item.controller;importcom.yigou.item.pojo.Item;importjava.util.List;importcom.yigou.item.service.ItemService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.http.HttpStatus;importorg.springframework.http.ResponseEntity;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;/** * author bruceliu * create 2019-09-01 12:38 * description */RestControllerRequestMapping(item)publicclassItemController{AutowiredprivateItemService itemService;PostMappingpublicResponseEntityItemsaveItem(Item item){// 校验商品的价格if(item.getPrice()null){thrownewRuntimeException(价格不能为空);}Item item1itemService.saveItem(item);returnResponseEntity.status(HttpStatus.CREATED).body(item1);}}测试结果是SpringMvc处理的异常但是500是服务器内部错误而真正异常的原因是客户端引发的异常上述异常是由 SpringMVC 处理的而我们真正要的是自己处理2.通用的异常处理放到yigou-common里面公共起来ExceptionEnum枚举 异常packagecom.yigou.common.enums;importlombok.*;/** * author bruceliu * create 2019-09-03 22:35 * description */GetterNoArgsConstructorAllArgsConstructorpublicenumExceptionEnum{PRICE_CANNOT_BE_NULL(400,价格不能为空);privateintcode;privateString msg;}ExceptionResult异常结果 定义packagecom.yigou.common.vo;importcom.yigou.common.enums.ExceptionEnum;importlombok.Data;/** * author bruceliu * create 2019-09-03 22:37 * description */DatapublicclassExceptionResult{privateintstatus;privateString message;privateLong timestamp;publicExceptionResult(ExceptionEnum em){this.statusem.getCode();this.messageem.getMsg();this.timestampSystem.currentTimeMillis();}}YigouException自定义 异常packagecom.yigou.common.exception;importcom.yigou.common.enums.ExceptionEnum;importlombok.AllArgsConstructor;importlombok.Getter;importlombok.NoArgsConstructor;/** * author bruceliu * create 2019-09-03 22:40 * description */NoArgsConstructorAllArgsConstructorGetterpublicclassYigouExceptionextendsRuntimeException{privateExceptionEnum exceptionEnum;}CommonExceptionHandler定义 通用的异常处理添加依赖不需要指定版本dependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactId/dependencypackagecom.yigou.common.advice;importcom.yigou.common.exception.YigouException;importcom.yigou.common.vo.ExceptionResult;importorg.springframework.http.ResponseEntity;importorg.springframework.web.bind.annotation.ControllerAdvice;importorg.springframework.web.bind.annotation.ExceptionHandler;/** * author bruceliu * create 2019-09-03 22:41 * description */ControllerAdvicepublicclassCommonExceptionHandler{ExceptionHandler(YigouException.class)publicResponseEntityExceptionResulthandleException(YigouException e){returnResponseEntity.status(e.getExceptionEnum().getCode()).body(newExceptionResult(e.getExceptionEnum()));}}在yigou-item-service里面依赖yigou-commondependencygroupIdcom.yigou.parent/groupIdartifactIdyigou-common/artifactIdversion1.0-SNAPSHOT/version/dependency改写 ItemControllerpackagecom.yigou.item.controller;importcom.yigou.common.enums.ExceptionEnum;importcom.yigou.common.exception.YigouException;importcom.yigou.item.pojo.Item;importjava.util.List;importcom.yigou.item.service.ItemService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.http.HttpStatus;importorg.springframework.http.ResponseEntity;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;/** * author bruceliu * create 2019-09-01 12:38 * description */RestControllerRequestMapping(item)publicclassItemController{AutowiredprivateItemService itemService;PostMappingpublicResponseEntityItemsaveItem(Item item){// 校验商品的价格if(item.getPrice()null){thrownewYigouException(ExceptionEnum.PRICE_CANNOT_BE_NULL);}Item item1itemService.saveItem(item);returnResponseEntity.status(HttpStatus.CREATED).body(item1);}}测试