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; } }