Spring Cloud 统一输出的日期数据格式

在我们使用SpringCloud服务框架中,可以根据我们自己的需要进行定义数据报文传输的格式;

spirngcloud中默认使用的是jackson 库 ,我们可以对它进行拓展和自定义。

我们可以通过注解获取现有已经实例化好的ObjectMapper对象。

/**
 * 系统默认的映射关系类
 */
@Autowired
ObjectMapper objectMapper;

此代码可以定义到配置文件中,在需要的地方定义。然后我们可以对其进行拓展和更新。

/**
 * 配置feign调用的解码器
 *
 * @return @Decoder
 */
@Bean
public Decoder feignDecoder() {
    log.info("================= 初始化 feignDecoder ");
    // 放弃系统默认的配置,重新初始化一个,根据后续的需要进行自定义
    // PlatFormMessageConverter platConverter = new PlatFormMessageConverter(objectMapper);
    // ObjectMapper mapper = new ObjectMapper();
    JsonMapper.builder().disable(MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS);
    // 2.13.0之后的版本会禁用,我们目前还有部分在使用,使用一段时间在进行删除
    objectMapper.disable(MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS);
    log.debug("放弃系统默认的配置,重新初始化一个,根据后续的需要进行自定义 at BaseConfig");
    PlatFormMessageConverter platConverter = new PlatFormMessageConverter(objectMapper);
    ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(platConverter);
    // JsonMapper.builder().enable(MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS);
    return new SpringDecoder(objectFactory);
}


@Bean
public Encoder feignEncoder() {
    log.info("================= 初始化 feignEncoder ");
    // PlatFormMessageConverter platConverter = new PlatFormMessageConverter(objectMapper);
    // ObjectMapper mapper = new ObjectMapper();
    JsonMapper.builder().disable(MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS);
    // 2.13.0之后的版本会禁用,我们目前还有部分在使用,使用一段时间在进行删除
    objectMapper.disable(MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS);
    PlatFormMessageConverter platConverter = new PlatFormMessageConverter(objectMapper);
    ObjectFactory<HttpMessageConverters> objectFactory = () -> new HttpMessageConverters(platConverter);
    // JsonMapper.builder().enable(MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS);
    return new SpringEncoder(objectFactory);
}

在2.13.0以后的版本中,objectMapper.disable(MapperFeature)方法已经过期了,可以使用JsonMapper.builder().disable(MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS); 来替换。

考虑现在还在过度阶段,还有很多lib库使用的还是旧版本,我两种方式都使用了 。

其中 JsonMapper.builder().disable(MapperFeature.IGNORE_DUPLICATE_MODULE_REGISTRATIONS); 很关键,系统已经包含了默认的日期处理的实例,如果我们要替换的话,必须支持更新。

PlatFormMessageConverter配置内容如下:

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;


import java.nio.charset.Charset;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;

@Slf4j
public class PlatFormMessageConverter extends MappingJackson2HttpMessageConverter {
    /**
     * 实例化信息转换方法
     */
    public PlatFormMessageConverter() {
        List<MediaType> mediaTypes = new ArrayList<>();
        mediaTypes.add(MediaType.APPLICATION_JSON);
        mediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
        mediaTypes.add(MediaType.APPLICATION_ATOM_XML);
        mediaTypes.add(MediaType.MULTIPART_FORM_DATA);
        log.info("--> 初始化设置 mediaTypes {} ,pub 中的配置,单个工程中就不用再次进行配置 ", mediaTypes);
        setSupportedMediaTypes(mediaTypes);
    }


    /**
     * 实例化信息转换方法,需要objecktMapper的支持
     *
     * @param objectMapper
     */
    public PlatFormMessageConverter(ObjectMapper objectMapper) {
        List<MediaType> mediaTypes = new ArrayList<>();
        mediaTypes.add(MediaType.APPLICATION_JSON);
        mediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
        mediaTypes.add(MediaType.APPLICATION_ATOM_XML);
        mediaTypes.add(MediaType.MULTIPART_FORM_DATA);
        log.info("--> 初始化设置 mediaTypes {} ,pub 中的配置,单个工程中就不用再次进行配置 ", mediaTypes);
        setSupportedMediaTypes(mediaTypes);
        log.info("--> 初始化设置 objectMapper ,pub 中的配置,单个工程中就不用再次进行配置 ");
        setObjectMapper(assembleObjectMapper(objectMapper));
        log.info("--> 初始化设置 defaultCharset {}", Charset.defaultCharset());
        setDefaultCharset(Charset.defaultCharset());
    }


    /**
     * 初始化Json对象映射服务对象
     *
     * @return
     */
    public ObjectMapper assembleObjectMapper(ObjectMapper objectMapper) {
        objectMapper = this.registerModule(objectMapper);
        JacksonUtil.setObjectMapper(objectMapper);
        return objectMapper;
    }


    /**
     * 初始化内容,和设置默认的
     *
     * @param objectMapper 映射对象
     * @return ObjectMapper
     */
    public ObjectMapper registerModule(ObjectMapper objectMapper) {
        objectMapper = (objectMapper == null ? new ObjectMapper() : objectMapper);
        log.info("--> init objectMapper for jackson  ");
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        // 按照系统的默认配置,取消null 返回值的配置,没有值 就不给前段进行送
        // objectMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
        //美化json字符串打印输出
        //objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
        // json数据中添加数据的格式类型,@class=java.lang.String
        // objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateFormatConstants.DATE_TIME_OIL_FORMATTER));
        javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateFormatConstants.DATE_OIL_FORMATTER));
        javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateFormatConstants.TIME_OIL_FORMATTER));
        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateFormatConstants.DATE_TIME_OIL_FORMATTER));
        javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateFormatConstants.DATE_OIL_FORMATTER));
        javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateFormatConstants.TIME_OIL_FORMATTER));


        objectMapper.registerModule(javaTimeModule);
        return objectMapper;
    }
}

其中 JacksonUtil 是拓展工具类的一种设置的方式,如果有需要可以自行定义,如果不需要删除即可。

大家可以参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

低头确望水中月亮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值