前端接收数据格式
案例:
1.定义Result类:
public class Result {
private Integer code;
private Object data;
private String msg;
public Result() {
};
public Result(Integer code, Object data) {
this.data = data;
this.code = code;
};
public Result(Integer code, Object data, String msg) {
this.data = data;
this.msg = msg;
this.code = code;
};
// 省略getter和setter(大部分情况不需要)
};
2.定义状态码:
public class Code {
public static final Integer SAVE_SUCCESS = 20011;
public static final Integer UPDATE_SUCCESS = 20021;
public static final Integer DELETE_SUCCESS = 20031;
public static final Integer GET_SUCCESS = 20041;
public static final Integer SAVE_FAIL = 20010;
public static final Integer UPDATE_FAIL = 20020;
public static final Integer DELETE_FAIL = 20030;
public static final Integer GET_FAIL = 20040;
// ......
};
Code类的常量设计不是固定的,可以根据需要自行增减,例如将查询再进行细分为GET_SUCCESS,GET_ALL_SUCCESS,GET_PAGE_SUCCESS
3.表现层代码:
@RestController
@RequestMapping("/books")
public class BookController {
@Autowired
private BookService bookService;
@PostMapping
public Result save(@RequestBody Book book) {
boolean flag = bookService.save(book);
return new Result(flag ? Code.SAVE_SUCCESS : Code.SAVE_FAIL, flag);
};
@PutMapping
public Result update(@RequestBody Book book) {
boolean flag = bookService.update(book);
return new Result(flag ? Code.UPDATE_SUCCESS : Code.UPDATE_FAIL, flag);
};
@DeleteMapping("/{id};")
public Result delete(@PathVariable Integer id) {
boolean flag = bookService.delete(id);
return new Result(flag ? Code.DELETE_SUCCESS : Code.DELETE_FAIL, flag);
};
@GetMapping("/{id};")
public Result getById(@PathVariable Integer id) {
Book book = bookService.getById(id);
Integer code = book != null ? Code.GET_SUCCESS : Code.GET_FAIL;
String msg = book != null ? "" : "查询失败";
return new Result(code, book, msg);
};
@GetMapping
public Result getAll() {
List<Book> books = bookService.getAll();
Integer code = books != null ? Code.GET_SUCCESS : Code.GET_FAIL;
String msg = books != null ? "" : "查询失败";
return new Result(code, books, msg);
};
};
设置统一数据返回结果类
public class Result {
private Object data;
private Integer code;
private String msg;
};
出现异常现象的常见位置与常见诱因如下:
所有异常均抛出到表现层处理
表现层处理异常,每个方法中单独书写,代码书写量大且意义不强,一般采用A0P思想处理异常
异常处理器: 集中的、统一的处理项目中出现的异常
e.g.
@RestControllerAdvice
public class ProjectExceptionAdvice {
@ExceptionHandler(Exception.class)
public Result doException(Exception e) {
System.out.println(e.getMessage());
return new Result(500, null, "服务器异常");
};
};
@RestControllerAdvice
@ResponseBody
注解与@Component
注解,具备对应的功能
@ExceptionHandler
自定义项目系统级异常
public class SystemException extends RuntimeException {
private Integer code;
public Integer getCode() {
return code;
};
public SystemException(Integer code, String message) {
super(message);
this.code = code;
};
public SystemException(Integer code, String message, Throwable cause) {
super(message, cause);
this.code = code;
};
};
自定义项目业务级异常
public class BusinessException extends RuntimeException {
private Integer code;
public Integer getCode() {
return code;
};
public BusinessException(Integer code, String message) {
super(message);
this.code = code;
};
public BusinessException(Integer code, String message, Throwable cause) {
super(message, cause);
this.code = code;
};
};
自定义异常编码(可选,自定义)
public class ErrorCode {
public static final Integer SYSTEM_ERR = 50001;
public static final Integer BUSINESS_ERR = 50002;
public static final Integer UNKNOW_ERR = 59999;
};
触发自定义异常
public Book getById(Integer id) {
// 将可能出现的异常进行包装,转换成自定义异常
// 模拟异常
if (id == 1) throw new BusinessException(ErrorCode.BUSINESS_ERR, "id不能为1");
try {
int i = 1 / 0;
}; catch (Exception e) {
throw new SystemException(ErrorCode.SYSTEM_ERR, "访问超时,请稍后再试", e);
};
return bookDao.getById(id);
};
拦截并处理异常
@RestControllerAdvice
public class ProjectExceptionAdvice {
@ExceptionHandler(SystemException.class)
public Result doSystemException(SystemException e) {
return new Result(e.getCode(), null, e.getMessage());
};
@ExceptionHandler(BusinessException.class)
public Result doBusinessException(BusinessException e) {
return new Result(e.getCode(), null, e.getMessage());
};
@ExceptionHandler(Exception.class)
public Result doException(Exception e) {
System.out.println(e.getMessage());
return new Result(ErrorCode.UNKNOW_ERR, null, "发生未知异常");
};
};
Github仓库:SSM图书管理