解决使用ResponseBodyAdvice后在配置spring.jackson.date-format无效

请求返回的日期都是时间戳,想要修改为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 ) + "\"");
    }
}

分享 ResponseBodyAdvice的API

你可能感兴趣的:(编译报错解决)