@JsonSerialize—优雅地封装返回值

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 {
    @Override
    public 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;
}

你可能感兴趣的:(这就叫优雅,Spring,SpringBoot,java,spring,springboot)