需求背景
需求一:SpringMVC构建的微服务系统,数据库对日期的存储是Long类型的时间戳,前端之前是默认使用Long类型时间,现在前端框架改动,要求后端响应数据时,Long类型的时间自动变成标准时间格式(yyyy-MM-dd HH:mm:ss)。
涉及到这个转换的范围挺大,所有的实体表都有创建时间createTime和修改时间updateTime,目前的主要诉求也是针对这两个字段,并且在实体详情数据和列表数据都存在,需要一个统一的方法,对这两个字段进行处理。
需求二:前端请求上传的JSON报文,String类型的内容,可能会出现前后有空格的现象,如果前端框架未对此问题进行处理,后端收到的JSON请求反序列化为对象时,就会出现String类型的值,前后有空格,现需要一个统一的处理方法,对接收的String类型属性执行trim方法。
解决方案
SpringMVC默认的JSON框架为jackson,也可以使用fastjson。
jackson框架
自定义序列化
如果项目使用jackson框架做json序列化,推荐的方案是使用@JsonSerialize注解,示例代码如下:
@JsonSerialize(using = CustomDateSerializer.class)
private Long createTime;
@JsonSerialize(using = CustomDateSerializer.class)
private Long updateTime;
CustomDateSerializer类的实现示例如下:
public class CustomDateSerializer extends JsonSerializer<Long> {
@Override
public void serialize(Long aLong, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(aLong);
jsonGenerator.writeString(sdf.format(date));
}
}
这种方案的好处如下:
- 自定义的实现类可以复用
- 精准到需要转换处理的字段,不受限于createTime和updateTime,更贴近于需求
缺点就是需要转换的字段都需要使用注解,工作量有点大
当然有其他的统一处理方案,这里不赘述。
自定义反序列化
在jackson框架上实现自定义序列化,也是非常方便的,继承SimpleModule类即可:
@Component
public class StringTrimModule extends SimpleModule {
public StringTrimModule() {