四川省住房与建设厅网站广东seo
1.场景
项目开发中给前端提供查询接口时,经常遇到需要将从数据库中取出来的字段值做一层重新封装。比如数据库中存的状态值是数字,返回给前端的时候,前端并不知道这个数值代表什么意思。此时,有两种方式:
(1)前端那边维护一个枚举,负责翻译后端返回的值;
(2)后端直接翻译好返回给前端。
这里,笔者的这篇博客针对第二种方式,提供一种优雅的字段处理方式。
举例:
笔者这里有个查询任务列表的接口,返回的任务列表里任务的状态值是0、1、2这样的数值,需要将这些数值翻译成“待完成”“已完成”“已延期”这样的中文,并返回给前端。
2.自定义序列化类
首先自定义一个序列化类TaskStatusSerializer,继承 JsonSerializer 类,并重写serialize接口。
注意:JsonSerializer类后面的泛型,取决于被转换的数值的类型。由于状态值是 0、1、2 ,也就是Integer类型,所以这里的泛型T直接传入Integer。
代码如下所示:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;import java.io.IOException;/*** 任务状态序列化类** @author: dong* @date: 2023/2/20 21:11* @since: 1.0*/
public class TaskStatusSerializer extends JsonSerializer<Integer> {@Overridepublic void serialize(Integer value, JsonGenerator gen, SerializerProvider serializers) throws IOException {if (value == null) {gen.writeString("未知的任务状态");return;}switch (value) {case 0:gen.writeString("待完成");break;case 1:gen.writeString("已完成");break;case 2:gen.writeString("已延期");break;default:break;}}
}
3.添加@JsonSerialize
在返回给前端的VO类里的任务状态字段上添加@JsonSerialize注解,并设置属性using 的值。
按照如下方式设置:
也就是说,按照如下方式设置,taskStatus在返回给前端的时候会使用TaskStatusSerializer这个自定义的序列化类进行封装。
public class TaskManageVO {@JsonSerialize(using = TaskStatusSerializer.class)private Integer taskStatus;
}