title: 乐优商城学习笔记二
date: 2019-04-12 16:56:37
tags:
- 乐优商城
- java
- springboot
categories:
- 乐优商城
通用异常处理
1. 场景预设
新增商品类,接受以下两个参数:
price 价格
name 名称
对数据进行校验:
- 价格不能为空
2.代码实现
实体类:
public class Item {
private Integer id;
private String name;
private Long price;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getPrice() {
return price;
}
public void setPrice(Long price) {
this.price = price;
}
}
service类:
该demo为测试所用,所以并未从数据库中获取数据而是采用本地的数据的方式。
@Service
public class ItemSevice {
public Item saveTtem(Item item){
//商品新增
int id = new Random().nextInt(100);
item.setId(id);
return item;
}
}
web类:
该demo主要是对通用异常如何使用的理解,通过注入ItemService获取所需依赖。在saveItem方法中,对价格进行了判断,如果为空则抛出异常,我们主要学习的是对抛出的异常进行处理。
@RestController
@RequestMapping("item")
public class ItemController {
@Autowired
private ItemSevice itemSevice;
@PostMapping
public ResponseEntity<Item> saveItem(Item item){
//校验价格
if (item.getPrice() == null){
// return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
throw new LyException(ExceptionEnum.PRICE_CANNOT_BE_NULL);
}
return ResponseEntity.status(HttpStatus.CREATED).body(item);
}
}
exception类:
LyException调用了自定义的枚举类型ExceptionEnum。
/*
*注解使用的是lombok的库,主要目的简化开发过程,省去写getter和setter方法以及构造函数
*/
@NoArgsConstructor//无参构造函数
@AllArgsConstructor//有参构造函数
@Getter//获得getter方法
public class LyException extends RuntimeException {
private ExceptionEnum exceptionEnum;
/* public ExceptionEnum getExceptionEnum() {
return exceptionEnum;
}*/
}
enums类:
定义的枚举常量一般为大写。
@NoArgsConstructor
@AllArgsConstructor
@Getter
public enum ExceptionEnum {
PRICE_CANNOT_BE_NULL(400, "价格不能为空"),
//PRICE_CANNOT_BE_NULL(400,"价格不能为空"),
;
private int code;
private String msg;
}
通用处理方法
- @ControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。
- ResponseEntity继承了HttpEntity,是HttpEntity的子类且可以添加HttpStatus状态码(推测HttpEntity不能添加HttpStatus状态码)。被用于RestTemplate和Controller层方法
- ResponseEntity是通用类型,因此可以使用任意类型作为响应体
@ControllerAdvice
public class CommonExceptionHandler {
@ExceptionHandler(LyException.class)
public ResponseEntity<ExceptionResult> handleException(LyException e){
//ExceptionEnum em =e.getExceptionEnum();
return ResponseEntity.status(e.getExceptionEnum().getCode())
.body(new ExceptionResult(e.getExceptionEnum()));
}
}
通用异常处理核心方法如上所示,返回ResponseEntity方法。.body(new ExceptionResult(e.getExceptionEnum()));获取异常结果。
3.运行结果
成功
![](https://img.haomeiwen.com/i7149586/e4a8e7ed9e06a860.png)
失败
![](https://img.haomeiwen.com/i7149586/3e255c8eec70089b.png)
网友评论