接口统一返回包装类和异常处理
在以SpringBoot开发Restful接口时,统一返回方便前端进行开发和封装,以及出现时给出响应编码和信息,对接口返回内容统一封装。
目录:
1.Constants接口
这个是定义的常量,这里的都是返回到前端的的code,其中200为成功
package com.xxxx.demo.common; public interface Constants { String CODE_200 = "200"; //成功 String CODE_401 = "401"; // 权限不足 String CODE_400 = "400"; // 参数错误 String CODE_500 = "500"; // 系统错误 String CODE_600 = "600"; // 其他业务异常 }
2.Result类
扔到前端响应的统一封装类,其中code等于200的时候为成功,这里定义了几个常见的异常类型,也可以自己按照需求定义
package com.xxxx.demo.common; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * 接口统一返回包装类 */ //返回信息类' @Data @NoArgsConstructor @AllArgsConstructor public class Result { private String code;// private String msg; private Object data;//通用的类型 public static Result success() {//构造方法,成功 return new Result(Constants.CODE_200, "", null); } public static Result success(Object data) {//构造方法,成功 return new Result(Constants.CODE_200, "", data); } public static Result error(String code, String msg) {//构造方法,错误 return new Result(code, msg, null); } public static Result error() {//构造方法,错误 return new Result(Constants.CODE_500, "系统错误", null); } }
这个时候就可以都往前端丢这个Result类型了
例一:
这里在前端收到的信息是一个统一封装类,Result类型,这里的res.code=='200'的时候是成功的,然后这个数据是res.data
例二:
再看看这个然后个人中心的时候按照用户id查询:
然后前端的代码是这样的,数据是res.data,然后判断状态码是'200'的时候是成功的
例三:这个加载页面的时候
然后这个recorde和total就是这样的,例如这个返回的data是一个对象,然后调用里面的东西就是res.data.records和res.data.total
然后后端每一个返回的都是Result,前端每一个都要判断,code=='200'的时候就是正确的,返回正确的就是return Result(调用后端的方法);返回错误就是return Result(错误的code,调用的后端的方法)
这时后台的东西就是这样了:想要数据的话就是.data
3.异常处理和自定义异常
然后这个GlobalExceptionHandler.class
package com.xxxx.demo.exception; import com.xxxx.demo.common.Result; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; @ControllerAdvice public class GlobalExceptionHandler { /** * 如果抛出的的是ServiceException,则调用该方法 * @param se 业务异常 * @return Result */ @ExceptionHandler(ServiceException.class) @ResponseBody public Result handle(ServiceException se){ return Result.error(se.getCode(), se.getMessage()); } }
然后这个ServiceException.class
package com.xxxx.demo.exception; import lombok.Getter; /** * 自定义异常 */ @Getter public class ServiceException extends RuntimeException { private String code; public ServiceException(String code, String msg) { super(msg); this.code = code; } }
然后抛出一个异常的时候就可以这样了
try { one = getOne(queryWrapper); // 从数据库查询用户信息 } catch (Exception e) { LOG.error(e); throw new ServiceException(Constants.CODE_500, "系统错误");//抛出一个异常 }