spring mvc綁定對象String轉Date 問題

spring mvc綁定對象String轉Date 問題

1.問題

有時前臺頁面傳遞的參數 是時間字符串形式,而後臺接受的實體屬性類型是java.util.Date類型。springmvc 就無法將值set到該屬性上

2.原因

後臺的json 反序列化分 fastJson 和 jackson

fastjson默認使用的序列化格式:

public static String           DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

jackson默認支持的日期反序列格式:

("yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "EEE, dd MMM yyyy HH:mm:ss zzz", "yyyy-MM-dd"))

jackson默認的日期反序列化不支持yyyy-MM-dd HH:mm:ss 這種格式,所以在屬性上加註解後臺依然報錯 有可能是註解的時間字符串格式不正確導致反序列化失敗

3.解決辦法

1.重寫jackson反序列化

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 java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @version 1.0.0
 * @description 重寫反序列化
 **/
public class CustomJsonDateDeserializer extends JsonDeserializer<Date> {

    @Override
    public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date = jp.getText();
        try {
            return format.parse(date);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
}


然後在需要轉Date的屬性在加上註解

@JsonDeserialize(using = CustomJsonDateDeserializer.class)
private Date txnTime;
使用這種方式,需要重寫上面反序列化抽象類

2.直接使用jackson註解,不需要重寫反序列化

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date txnTime;

GMT+8表示時區,東八區

3.直接使用fastjson註解,不要重寫反序列化

前提是已經導入了fastjson的依賴

          <!-- fastjson -->
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>fastjson</artifactId>
		<version>1.2.32</version>
	</dependency>
	<!-- jackson-->
	<dependency>
		<groupId>com.fasterxml.jackson.core</groupId>
		<artifactId>jackson-databind</artifactId>
		<version>2.6.4</version>
	</dependency>

在時間屬性上加上註解

@JSONField(format = “yyyy-MM-dd HH:mm:ss”)
private Date txnTime;

4.總結

兩種註解方法,導入的包有所不同,注意formatter 的時間字符串格式

5.鏈接

參考另一位大師的博客基礎上總結。

原文鏈接:https://blog.csdn.net/zhuralll112/article/details/89875212

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