中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

springboot2中使用@JsonFormat注解不生效怎么解決

發布時間:2022-02-18 17:17:25 來源:億速云 閱讀:1870 作者:iii 欄目:開發技術

這篇“springboot2中使用@JsonFormat注解不生效怎么解決”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“springboot2中使用@JsonFormat注解不生效怎么解決”文章吧。

    使用@JsonFormat注解不生效

    百度了不少解決方式,有讓用@JsonField,也有讓把fastjson去掉的,也有加很多配置的,但是都沒用。

    本次使用的版本號

    1、springboot2.2.2 ;

    2、fastjson 1.1.26

    3、<jackson-mapper-asl.version>1.9.10</jackson-mapper-asl.version>     
    <jackson-core.version>2.10.3</jackson-core.version>

    第三點以及相關的依賴可能不需要,加上也沒關系

    pom文件中的依賴:

    <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>${fastjson.version}</version>
            </dependency>
    <dependency>
                <groupId>org.codehaus.jackson</groupId>
                <artifactId>jackson-mapper-asl</artifactId>
                <version>${jackson-mapper-asl.version}</version>
            </dependency> 
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
                <version>${jackson-core.version}</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>${jackson-core.version}</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
                <version>${jackson-core.version}</version>
            </dependency>

    解決方式

    第一步新建一個轉換類 用于自定義Jackson反序列化日期類型時應用的類型轉換器,一般用于@RequestBody接受參數時使用

    import com.fasterxml.jackson.core.JsonParser;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.DeserializationContext;
    import com.fasterxml.jackson.databind.JsonDeserializer;
    import org.apache.commons.lang3.StringUtils;
    import org.apache.commons.lang3.time.DateUtils;
     
    import java.io.IOException;
    import java.text.ParseException;
    import java.util.Date;
     
    /**
     * 自定義Jackson反序列化日期類型時應用的類型轉換器,一般用于@RequestBody接受參數時使用
     *  次類是借用網上別的人的,增加了一個日期格式化的類型
     */
    public class DateJacksonConverter extends JsonDeserializer<Date> {
        //此處尤為重要,請查找自己控制臺報錯的日期格式化類型是啥樣的
        //我的是2020-04-29T16:23:44.999Z 所以我在下面的數組中添加了 "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" 格式;如果下面數組中沒有你要的格式化類型,其他的可自行根據自己的情況去添加即可
        private static String[] pattern =
                new String[]{"yyyy-MM-dd", "yyyy-MM-dd HH:mm", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm:ss.S",
                        "yyyy.MM.dd", "yyyy.MM.dd HH:mm", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm:ss.S",
                        "yyyy/MM/dd", "yyyy/MM/dd HH:mm", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm:ss.S", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"};
     
        @Override
        public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
     
            Date targetDate = null;
            String originDate = p.getText();
            if (StringUtils.isNotEmpty(originDate)) {
                try {
                    long longDate = Long.valueOf(originDate.trim());
                    targetDate = new Date(longDate);
                } catch (NumberFormatException e) {
                    try {
                        targetDate = DateUtils.parseDate(originDate, DateJacksonConverter.pattern);
                    } catch (ParseException pe) {
                        throw new IOException(String.format(
                                "'%s' can not convert to type 'java.util.Date',just support timestamp(type of long) and following date format(%s)",
                                originDate,
                                StringUtils.join(pattern, ",")));
                    }
                }
            } 
            return targetDate;
        } 
        @Override
        public Class<?> handledType() {
            return Date.class;
        }
    }

    創建好上邊的類之后,如果不想繼續,則可以在實體對象屬性上加注解就完全可以了。

    導入的包路徑為:

    import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
    @JsonDeserialize(using=DateJacksonConverter.class)
    private Date startDate;

    如果不想去讓實體類加這個注解,可以在寫一個公共配置,如下:

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean;
    import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
     
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fx.base.serializer.DateJacksonConverter;
     
    @Configuration
    public class ConverterConfig {
        @Bean
        public DateJacksonConverter dateJacksonConverter() {
            return new DateJacksonConverter();
        }
     
        @Bean
        public Jackson2ObjectMapperFactoryBean jackson2ObjectMapperFactoryBean(
                @Autowired
                        DateJacksonConverter dateJacksonConverter) {
            Jackson2ObjectMapperFactoryBean jackson2ObjectMapperFactoryBean = new Jackson2ObjectMapperFactoryBean();
     
            jackson2ObjectMapperFactoryBean.setDeserializers(dateJacksonConverter);
            return jackson2ObjectMapperFactoryBean;
        }
     
        @Bean
        public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(
                @Autowired
                        ObjectMapper objectMapper) {
            MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter =
                    new MappingJackson2HttpMessageConverter();
            mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);
            return mappingJackson2HttpMessageConverter;
        }
    }

    此時就不必再每個實體類屬性上加注解了。

    @JsonFormat和@DateTimeFormat的作用

    • @DatetimeFormat是將String轉換成Date,一般前臺給后臺傳值時用

        import org.springframework.format.annotation.DateTimeFormat;
        /**
         * 前臺傳后臺時, 字符串自動封裝成日期
         */
        @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        private Date birth;
    • @JsonFormat(pattern=”yyyy-MM-dd”) 將Date轉換成String 一般后臺傳值給前臺時

        import com.fasterxml.jackson.annotation.JsonFormat;
        /**
         * 后臺返給前臺時, 日期自動格式化
         */
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        private Date birth;

    注意:

    @JsonFormat不僅可以完成后臺到前臺參數傳遞的類型轉換,還可以實現前臺到后臺類型轉換。

    當content-type為application/json時,優先使用@JsonFormat的pattern進行類型轉換。而不會使用@DateTimeFormat進行類型轉換。

    @JsonFormat注解的作用就是完成json字符串到java對象的轉換工作,與參數傳遞的方向無關。

    以上就是關于“springboot2中使用@JsonFormat注解不生效怎么解決”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    永年县| 当阳市| 新田县| 治县。| 姚安县| 正安县| 龙州县| 东宁县| 华宁县| 廊坊市| 惠安县| 巨鹿县| 宜城市| 察哈| 呼和浩特市| 海安县| 布尔津县| 双峰县| 广南县| 三江| 保德县| 清镇市| 遵化市| 儋州市| 阿坝县| 内丘县| 社旗县| 霍城县| 房产| 新丰县| 横峰县| 于都县| 溧阳市| 淮安市| 丹东市| 新田县| 来安县| 明星| 龙南县| 景东| 宝山区|