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 */@Data@NoArgsConstructor@AllArgsConstructorpublicclassItem{privateInteger id;privateString name;privateLong price;}service:
packagecom.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){// 商品新增intid=newRandom().nextInt(100);item.setId(id);returnitem;}}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 */@RestController@RequestMapping("item")publicclassItemController{@AutowiredprivateItemService itemService;@PostMappingpublicResponseEntity<Item>saveItem(Item item){// 校验商品的价格if(item.getPrice()==null){returnResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);}Item item1=itemService.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 */@RestController@RequestMapping("item")publicclassItemController{@AutowiredprivateItemService itemService;@PostMappingpublicResponseEntity<Item>saveItem(Item item){// 校验商品的价格if(item.getPrice()==null){thrownewRuntimeException("价格不能为空!");}Item item1=itemService.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 */@Getter@NoArgsConstructor@AllArgsConstructorpublicenumExceptionEnum{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.status=em.getCode();this.message=em.getMsg();this.timestamp=System.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 */@NoArgsConstructor@AllArgsConstructor@GetterpublicclassYigouExceptionextendsRuntimeException{privateExceptionEnum exceptionEnum;}CommonExceptionHandler:定义 通用的异常处理
添加依赖(不需要指定版本)
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId></dependency>packagecom.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)publicResponseEntity<ExceptionResult>handleException(YigouException e){returnResponseEntity.status(e.getExceptionEnum().getCode()).body(newExceptionResult(e.getExceptionEnum()));}}在yigou-item-service里面依赖yigou-common:
<dependency><groupId>com.yigou.parent</groupId><artifactId>yigou-common</artifactId><version>1.0-SNAPSHOT</version></dependency>改写 ItemController
packagecom.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 */@RestController@RequestMapping("item")publicclassItemController{@AutowiredprivateItemService itemService;@PostMappingpublicResponseEntity<Item>saveItem(Item item){// 校验商品的价格if(item.getPrice()==null){thrownewYigouException(ExceptionEnum.PRICE_CANNOT_BE_NULL);}Item item1=itemService.saveItem(item);returnResponseEntity.status(HttpStatus.CREATED).body(item1);}}测试: