springboot 项目实战-03章-封装通用类,请求和返回体

1.新增通用返回类,以后所有接口都使用该类作为返回类。

为什么需要通用返回类?后端接口较多,为了前端对后端的返回结果做统一的处理,需要规范后端的返回值。可以通过新增通用返回类,来规范统一的返回结果

例子:

public class CommonResp<T> {

     /**
      * 业务上的成功或失败
      */
     private boolean success = true;//默认是true

     /**
      * 返回信息
      */
     private String message;

     /**
      * 返回泛型数据,自定义类型
      */
     private T content;

     public boolean getSuccess() {
         return success;
     }

     public void setSuccess(boolean success) {
         this.success = success;
     }

     public String getMessage() {
         return message;
     }

     public void setMessage(String message) {
         this.message = message;
     }

     public T getContent() {
         return content;
     }

     public void setContent(T content) {
         this.content = content;
     }

     @Override
     public String toString() {
         final StringBuffer sb = new StringBuffer("ResponseDto{");
         sb.append("success=").append(success);
         sb.append(", message='").append(message).append('\'');
         sb.append(", content=").append(content);
         sb.append('}');
         return sb.toString();
     }
 }

2.新增请求类。Spring 自动封装,将参数自动映射到类属性

为什么要使用请求类?自动封装,避免多次开发以及传入参数过长等问题。自动封装,只要类中的属性名和入参的属性名一致,Spring会自动映射。

public class EbookReq {
    private Long id;

    private String name;


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    //打印日志用的
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(getClass().getSimpleName());
        sb.append(" [");
        sb.append("Hash = ").append(hashCode());
        sb.append(", id=").append(id);
        sb.append(", name=").append(name);
        sb.append("]");
        return sb.toString();
    }
}

请求

GET http://localhost:8088/ebook/list?name=Oracle
Accept: application/json

可以将name 自动封装给EbookReq。避免了下次需要传入id的时候, 又要重新开发controller层和service层。

3.返回参数的封装

为什么需要封装返回参数?

1中已经封装过一次了,为什么这里还要说封装?因为对于通用返回来说,并不是把所有的content结果都封装返回的。比如登陆信息中的密码字段,是不返回给用户的。所以粗暴的把整个数据库的结果都返回给用给用户,是不合理的。

定义content的返回类型,然后使用spring的拷贝功能,实现拷贝

BeanUtils.copyProperties(ebook, ebookQueryResp);//对象复制
ebook:源数据 
ebookQueryResp:目标拷贝对象

 4.使用泛型,拷贝对象

package com.sankuai.wiki.util;

import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
//利用泛型,实现单个对象拷贝和列表拷贝
public class CopyUtil {

    /**
     * 单体复制
     */
    public static <T> T copy(Object source, Class<T> clazz) {
        if (source == null) {
            return null;
        }
        T obj = null;
        try {
            obj = clazz.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        BeanUtils.copyProperties(source, obj);
        return obj;
    }

    /**
     * 列表复制
     */
    public static <T> List<T> copyList(List source, Class<T> clazz) {
        List<T> target = new ArrayList<>();
        if (!CollectionUtils.isEmpty(source)){
            for (Object c: source) {
                T obj = copy(c, clazz);
                target.add(obj);
            }
        }
        return target;
    }
}

 

posted @ 2022-03-24 10:40  XiaoLee-C  阅读(714)  评论(0编辑  收藏  举报