自定義 feign 反序列化時間字符格式


參考 :
https://blog.csdn.net/forezp/article/details/73480304

feign client 默認配置類:默認的配置類為FeignClientsConfiguration 配置了解碼和編碼。

當請求Feign Client的方法執行時會被 SynchronousMethodHandler 類中的 invoke 方法所攔截。

跟蹤代碼可知, feign 反序列化對象時,使用 jackson

objectMapper 類在 com.fasterxml.jackson.databind 包中

解析時間格式

重寫 DateFormat,從而支持 yyy-MM-dd HH:mm:ss 的字符串格式時間能轉化為 Date 對象,而默認格式時間格式支持:2018-07-04T06:23:15.338Z

@Slf4j
public class CustomJackDateFormat extends DateFormat {
    private SimpleDateFormat format = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
    private DateFormat dateFormat;

    public CustomJackDateFormat(DateFormat dateFormat) {
        this.dateFormat = dateFormat;
        // 時間轉換時,默認相差 8 小時,所以這里設置了時區
        dateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
        log.info("自定義 jackson時間 轉化格式初始化");
    }


    @Override
    public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) {
        return dateFormat.format(date, toAppendTo, fieldPosition);

    }

    @Override
    public Date parse(String source, ParsePosition pos) {
        Date date = null;
        try {
            // 先按我的規則來
            date = format.parse(source, pos);
        } catch (Exception e) {
            // 不行,那就按原先的規則吧
            date = dateFormat.parse(source, pos);
        }
        return date;
    }

    // 這里裝飾clone方法的原因是因為clone方法在jackson中也有用到
    @Override
    public Object clone() {
        Object format = dateFormat.clone();
        return new CustomJackDateFormat((DateFormat) format);
    }
}

重新設置 ObjectMapper 的時間格式

@Configuration
@Slf4j
public class CustomWebConfig {


    @Autowired(required = false)
    private Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder;


    @Bean
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        ObjectMapper mapper = jackson2ObjectMapperBuilder.build();
        // ObjectMapper為了保障線程安全性,里面的配置類都是一個不可變的對象
        // 所以這里的setDateFormat的內部原理其實是創建了一個新的配置類
        DateFormat dateFormat = mapper.getDateFormat();
        // 自定義 jackson 轉換時間格式
        mapper.setDateFormat(new CustomJackDateFormat(dateFormat));

        MappingJackson2HttpMessageConverter mappingJsonpHttpMessageConverter = new MappingJackson2HttpMessageConverter(
                mapper);
        return mappingJsonpHttpMessageConverter;
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM