请求返回的日期都是时间戳,想要修改为yyyy-MM-dd HH:mm:ss
的格式,在网上搜索到的办法都是添加配置
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
但是使用后无效,原因是曾经使用实现了ResponseBodyAdvice接口的类将返回的ObjectId类型转换为字符串,体做法见
https://blog.csdn.net/qq_32784303/article/details/95071114
ResponseBodyAdvice接口是用于在请求数据返回前做统一处理的,猜测很可能是spring.jackson.date-format
配置也是通过实现ResponseBodyAdvice或类似接口来处理Date类型的返回数据,但自己的代码已经实现了这个接口,就会优先使用自己实现的,springboot实现的就不起作用了,那么能不能只过滤ObjectId,不处理其他类型的数据?
查看了ResponseBodyAdvice的API,发现过滤请求是在一整个请求返回前调用一次该实现方法,也就是说无法只针对一个返回参数处理了,如果一个请求同时返回ObjectId和Date类型的数据,怎么解决?
在ResponseBodyAdvice中也给Date类型加过滤处理:
package com.zhiku.config;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializeConfig;
import java.io.IOException;
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import com.alibaba.fastjson.serializer.SerializeWriter;
import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
@ControllerAdvice
public class MyResponseBodyAdvice implements ResponseBodyAdvice<Object>{
/**
* 是否拦截
* @param returnType 请求对应的控制类方法
*/
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
ServerHttpResponse response) {
SerializeConfig config = new SerializeConfig();
//添加date返回控制
config.put( Date.class, new DateJsonSerializer());
/*
...
用config.put()添加其他参数类型的序列化
*/
return JSONObject.parse(JSON.toJSONString(body, config));
}
}
class DateJsonSerializer implements ObjectSerializer{
@Override
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType,int features) throws IOException {
SerializeWriter out = serializer.getWriter();
if (object == null) {
serializer.getWriter().writeNull();
return;
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone( TimeZone.getTimeZone("Etc/GMT-8"));
out.write("\"" + sdf.format( (Date) object ) + "\"");
}
}