SpringBoot入门学习笔记-6-统一返回对象封装

对外接口,除了返回成功的数据外,还需要返回一些状态和消息,比如成功,失败,IO异常,未找到,格式错误,ID错误等。我会习惯封装一个统一的枚举用来定义所有的状态枚举,然后定一个统一的返回对象,供供controller层调用。

这样的好处,所有的枚举统一维护。返回外部时格式统一。

一、定义枚举类

package com.cn.laoluobase.controller.obj;

import lombok.Getter;

@Getter
public enum MyHttpEnum {

    // 枚举列表:
    SUCCESS(1000,"成功"),
    FAIL(999,"失败"),
    NOTFOUND(404,"未找资资源");

    // 枚举内部变量,msg\code.
    private Integer code;
    private String msg;


    // 枚举类构造函数
    MyHttpEnum(Integer code, String msg){
        this.code = code;
        this.msg = msg;
    }

    // 根据code返回枚举类
    public static MyHttpEnum byCode(Integer code){
        for (MyHttpEnum statusEnum : MyHttpEnum.values()) {
            if (statusEnum.getCode().equals(code)) {
                //如果需要直接返回name则更改返回类型为String,return statusEnum.name;
                return statusEnum;
            }
        }
        throw new IllegalArgumentException("code is invalid");
    }

    // 根据name返回枚举类
    public static MyHttpEnum byName(String name){
        for (MyHttpEnum statusEnum : MyHttpEnum.values()) {
            if (statusEnum.name().equals(name)) {
                //如果需要直接返回name则更改返回类型为String,return statusEnum.name;
                return statusEnum;
            }
        }
        throw new IllegalArgumentException("name is invalid");

    }


}

二、定义一个统一的返回对象。

package com.cn.laoluobase.controller.obj;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResultsObj {


   private Integer code;
   @JsonInclude(JsonInclude.Include.NON_NULL) // 当为空时不转换JSON输出。这样前端就不会返回null.
   private Object data;
   private String msg;

   // 标准方法1-成功,返回code\data\msg
   public static ResultsObj success(Object data){
      return new ResultsObj(MyHttpEnum.SUCCESS.getCode(),data,MyHttpEnum.SUCCESS.getMsg());
   }

   // 标准方法2-失败,返回code\msg
   public static ResultsObj fail(String msg){
      return new ResultsObj(MyHttpEnum.FAIL.getCode(),null,msg);
   }


   // 按code去查找枚举类。使用久了可能会新增很多枚举列表,逐个写成标准方法有点累,直接调用这个就行了。
   public static ResultsObj byCode(Integer code){
      MyHttpEnum httpEnum=MyHttpEnum.byCode(code);
      return new ResultsObj(httpEnum.getCode(),null, httpEnum.getMsg());
   }

   // 按name去查找枚举类。使用久了可能会新增很多枚举列表,逐个写成标准方法有点累,直接调用这个就行了。
   public static ResultsObj byName(String name){
      MyHttpEnum httpEnum=MyHttpEnum.byName(name);
      return new ResultsObj(httpEnum.getCode(),null, httpEnum.getMsg());
   }


}

注:byCode\byName是否返回data,可以自己修改。

三、Controller请求示例。

/**
     * ResultsObj返回示例1-标准方法ResultsObj.success、fail等
     * @return {
     *   "code": 1000,
     *   "data": 111111,
     *   "msg": "成功"
     * }
     * */
    @PostMapping("/results1")
    public ResultsObj post5(@RequestBody HashMap map){
        // @RequestParam 定义参数
        return ResultsObj.success(111111);
    }


    /**
     * ResultsObj返回示例2-根据code返回枚举类
     * @return {
     *   "code": 404,
     *   "msg": "未找资资源"
     * }
     * */
    @PostMapping("/results2")
    public ResultsObj post6(@RequestBody HashMap map){
        return  ResultsObj.byCode(404);
    }

    /**
     * ResultsObj返回示例3-根据name返回枚举类
     * @return {
     *   "code": 999,
     *   "msg": "失败"
     * }
     * */
    @PostMapping("/results3")
    public ResultsObj post7(@RequestBody HashMap map){
        return  ResultsObj.byName(MyHttpEnum.FAIL.name());
    }

用枚举定义好处有很多,比如可以不断的维护枚举列表,而不用去修改代码,通过byName或byCode调用即可。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值