SpringBoot写后端接口,看这一篇就够了( 四 )


可以参考我们自定义异常类 , 也来一个响应信息代码code和响应信息说明msg:
@Getterpublic class ResultVO {/*** 状态码 , 比如1000代表响应成功*/private int code;/*** 响应信息 , 用来说明响应情况*/private String msg;/*** 响应的具体数据*/private T data;public ResultVO(T data) {this(1000, "success", data);}public ResultVO(int code, String msg, T data) {this.code = code;this.msg = msg;this.data = http://kandian.youth.cn/index/data;}}然后我们修改一下全局异常处理那的返回值:
@ExceptionHandler(APIException.class)public ResultVO APIExceptionHandler(APIException e) {// 注意哦 , 这里返回类型是自定义响应体return new ResultVO<>(e.getCode(), "响应失败", e.getMsg());} @ExceptionHandler(MethodArgumentNotValidException.class)public ResultVO MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {ObjectError objectError = e.getBindingResult().getAllErrors().get(0);// 注意哦 , 这里返回类型是自定义响应体return new ResultVO<>(1001, "参数校验失败", objectError.getDefaultMessage());}我们再来看一下此时如果发生异常了会响应什么数据给前端:
OK , 这个异常信息响应就非常好了 , 状态码和响应说明还有错误提示数据都返给了前端 , 并且是所有异常都会返回相同的格式!异常这里搞定了 , 别忘了我们到接口那也要修改返回类型 , 我们新增一个接口好来看看效果:
@GetMapping("/getUser")public ResultVO getUser() {User user = new User();user.setId(1L);user.setAccount("12345678");user.setPassword("12345678");user.setEmail("123@qq.com");return new ResultVO<>(user);}看一下如果响应正确返回的是什么效果:
这样无论是正确响应还是发生异常 , 响应数据的格式都是统一的 , 十分规范!
数据格式是规范了 , 不过响应码code和响应信息msg还没有规范呀!大家发现没有 , 无论是正确响应 , 还是异常响应 , 响应码和响应信息是想怎么设置就怎么设置 , 要是10个开发人员对同一个类型的响应写10个不同的响应码 , 那这个统一响应体的格式规范就毫无意义!所以 , 必须要将响应码和响应信息给规范起来 。
响应码枚举要规范响应体中的响应码和响应信息用枚举简直再恰当不过了 , 我们现在就来创建一个响应码枚举类:
@Getterpublic enum ResultCode {SUCCESS(1000, "操作成功"),FAILED(1001, "响应失败"),VALIDATE_FAILED(1002, "参数校验失败"),ERROR(5000, "未知错误");private int code;private String msg;ResultCode(int code, String msg) {this.code = code;this.msg = msg;} }然后修改响应体的构造方法 , 让其只准接受响应码枚举来设置响应码和响应信息:
public ResultVO(T data) {this(ResultCode.SUCCESS, data);} public ResultVO(ResultCode resultCode, T data) {this.code = resultCode.getCode();this.msg = resultCode.getMsg();this.data = http://kandian.youth.cn/index/data;}然后同时修改全局异常处理的响应码设置方式:
@ExceptionHandler(APIException.class)public ResultVO APIExceptionHandler(APIException e) {// 注意哦 , 这里传递的响应码枚举return new ResultVO<>(ResultCode.FAILED, e.getMsg());} @ExceptionHandler(MethodArgumentNotValidException.class)public ResultVO MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {ObjectError objectError = e.getBindingResult().getAllErrors().get(0);// 注意哦 , 这里传递的响应码枚举return new ResultVO


推荐阅读