請您多多留言指教(自己搭建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註解會生效)。