springboot2.3 @JsonFormat註解不生效 馬虎造成(類未序列化)

請您多多留言指教(自己搭建springboot2.3.1+mybatisplus3.3.2)

注:以下爲搭建項目並查找@JsonFormat註解不生效的幾處關鍵位置

 

一、pom.xml引用Jackson依賴

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.11.0</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.11.0</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.0</version>
</dependency>
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.13</version>
</dependency>

二、DAO類對象實體 @JsonFormat註解 

@TableName("t_company")
public class Company {
    @TableId(value = "id", type = IdType.ASSIGN_UUID)
    private String id;

    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(value = "created_at")
    private Date createdAt;

    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @TableField(value = "updated_at")
    private Date updatedAt;

    ...其它屬性字段省略
}

三、application.yml jackson全局配置

# jackson全局配置
  jackson:
    # 全局設置@JsonFormat的格式pattern
    date-format: yyyy-MM-dd HH:mm:ss
    # 當地時區
    locale: zh
    # 設置全局時區
    time-zone: GMT+8
    serialization:
      #格式化輸出
      indent_output: true
#      #忽略無法轉換的對象
#      fail_on_empty_beans: false
#    deserialization:
#      #允許對象忽略json中不存在的屬性
#      fail_on_unknown_properties: false
    parser:
      #允許出現特殊字符和轉義符
      allow_unquoted_control_chars: true
      #允許出現單引號
      allow_single_quotes: true
#    #如果加該註解的字段爲null,那麼就不序列化這個字段了
#    default-property-inclusion: NON_EMPTY

四、自定義Jackson配置 JacksonConfig類

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import java.io.IOException;

@Configuration
public class JacksonConfig {
    /**
     * 重新注入ObjectMapper
     * 注:使用此方式ObjectMapper,application中Jackson自動失效
     *
     * @param builder
     * @return
     */
    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();

        // 通過該方法對mapper對象進行設置,所有序列化的對象都將按改規則進行系列化
        // Include.Include.ALWAYS 默認
        // Include.NON_DEFAULT 屬性爲默認值不序列化
        // Include.NON_EMPTY 屬性爲 空("") 或者爲 NULL 都不序列化,則返回的json是沒有這個字段的。這樣對移動端會更省流量
        // Include.NON_NULL 屬性爲NULL 不序列化
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
        // 反序列化時 忽略匹配不到的屬性字段
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        // 允許出現單引號
        objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
        // 字段保留,將null值轉爲""
        objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
            @Override
            public void serialize(Object o, JsonGenerator jsonGenerator,
                                  SerializerProvider serializerProvider)
                    throws IOException {
                jsonGenerator.writeString("");
            }
        });
        return objectMapper;
    }
}

五、Controller調用Service接口方法,執行

執行結果:

{
  "id": "1",
  "name": "測試公司1",
  "shortName": "測試公司1",
  "code": "test",
  "createdAt": "2020-06-28 14:52:39",
  "updatedAt": "2020-06-28 14:52:39",

  ......其它屬性省略
}

返回結果展示,並非@JsonFormat註解配置的時間格式。

 

六、查找原因,網上搜索相關知識,用了很久,配置皆正常。

然而在自己搭建springboot+mybatisplus框架中@JsonFormat註解未生效,讓自己很糾結,終於找到問題所在!

原因(大馬虎來了):類未實現序列化Serializable,導致註解失效

解決方案(親測已註解正常)

@TableName("t_company")
public class Company implements Serializable {
    private static final long serialVersionUID = -4294461808433313537L;
    ... 其它代碼省略
}

再次執行結果:

{
  "id": "1",
  "name": "測試公司1",
  "shortName": "測試公司1",
  "code": "test",
  "createdAt": "2020-06-28 14:52:39",
  "updatedAt": "2020-06-28",

  ......其它屬性省略
}

 

注:以上爲關鍵的四處位置,請細心檢查(一般情況下只要按照上面配置好,@JsonFormat註解會生效)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章