1.首先通过controller制造异常
@RestController
@RequestMapping("item")
public class ItemController {
@Autowired
private ItemService itemService;
@PostMapping
@ResponseBody
public ResponseEntity<Item> saveItem(Item item){
if(item.getPrice() == null){
throw new LyException(ExceptionEnum.PRICE_CANNOT_BE_NULL);
}
item = itemService.saveItem(item);
return ResponseEntity.status(HttpStatus.CREATED).body(item);
}
}
2.编写自定义的异常类
@NoArgsConstructor
@AllArgsConstructor
@Getter
public class LyException extends RuntimeException{
private ExceptionEnum exceptionEnum;
}
3.编写枚举类
@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum ExceptionEnum {
PRICE_CANNOT_BE_NULL(400,"价格不能为空")
;
private int code;
private String msg;
}
4.封装异常信息
@Data
public class ExceptionResult {
private int status;
private String message;
private Long timestamp;
public ExceptionResult (ExceptionEnum em){
this.status = em.getCode();
this.message = em.getMsg();
this.timestamp = System.currentTimeMillis();
}
}
5.通过@ControllerAdvice注解,只要spring能够扫描到的地方,就可以实现全局异常回调。
@Slf4j
@ControllerAdvice
public class CommonExceptionHandler {
@ExceptionHandler(LyException.class)
public ResponseEntity<ExceptionResult> handleException(LyException e) {
return ResponseEntity.status(e.getExceptionEnum().getCode())
.body(new ExceptionResult(e.getExceptionEnum()));
}
}
测试结果如下: