關於JavaDate數據返回到前端變數字的問題(並引申到前后端時間的傳輸)


不知道為什么,前端顯示的所有數據項都沒有錯,就只有時間那一項很奇怪,是一串數字,而且這個數字在數據庫怎么都找不到……

然后我在后端從service到controller都debug了一遍,發現數據都沒有錯,拿的都是時間啊。

后來百度知道,原來后台在返回json數據的時候,用自身的序列化機制會把時間變成一段很長的數字,就像上面的顯示一樣。

 

然后這里就要用到一個東西:

@JsonFormat,它的作用是,出參時,自動把Date型對象數據轉化成正確的格式化后的字符串出去

 

效果:

 

然后又通過度娘知道,還有個注解

@DateTimeFormat

這個是用於將前台傳到后台字符串變量轉換為Date類型。請求報文只需要傳入yyyymmddhhmmss字符串進來,則自動轉換為Date類型數據。(不過好像前端要傳的是json)

這里也有個小例子:

前端只傳了一個 格式正確的  時間字符串

layer.open({
        type : 2,
        title : '歸檔詳情',
        //btn: ['選中', '取消'],
        shade : false,
        area : [ '900px', '600px' ],
        maxmin : true,
        content : gateUrl.UiUrl + '/productbaseEdition?eTime='
                + edition.table.bootstrapTable('getSelections')[0].eTime,// 這里content是一個URL,如果你不想讓iframe出現滾動條,你還可以content:['http://sentsin.com', 'no']
        end : function() {

        }
});

這里就只是在請求url那里拼接了一個  eTime上去。

然后后台一開始直接用Date接,毫無疑問,無法成功,然后就用了這個@DateTimeFormat

看后端代碼:

@Controller
@RequestMapping("")
public class ProductbaseEditionController extends BaseController {
    
    @GetMapping("/productbaseEdition")
    public String productbaseEdition(@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")Date eTime) {
        System.out.println("#################test   time:"+eTime);
        return "productbaseEdition/list";
    }
}

接收成功!(這里不是json數據,然后用注解@JsonFormat似乎不能成功接收)

 

不過也有資料說,@JsonFormat不僅可以完成后台到前台參數傳遞的類型轉換,還可以實現前台到后台類型轉換。當content-type為application/json時,優先使用@JsonFormat的pattern進行類型轉換。而不會使用@DateTimeFormat進行類型轉換。

 

然后我也根據這個做了幾個實驗,

@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
//@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date eTime;//歸檔時間,也是歸檔的版本號

這是實體里面的一個屬性,前端傳用json傳數據過來,然后Controller用這個實體來接收

                 var data = {};
            data.id = edition.currentItem.id;
            data.eTime = edition.currentItem.eTime;
            layer.confirm('確定刪除這個歸檔版本嗎?', null, function (index) {
                
                $.ajax({
                    url: edition.baseUrl + "/editionDelete",
                    type: "POST",
                    data:JSON.stringify(data),
                    headers : {  
                        'Content-Type' : 'application/json;charset=utf-8'  
                    },
                    success: function (data) {
                        console.log(data);
                        if (data.code == '0') {
                            layerTips.msg("刪除成功!");
                            edition.refresh();
                        } else {
                            layerTips.msg("刪除失敗!")
                        
                        }
                    }
                });
                layer.close(index);
            });                

 

結論是:

1.前端如果傳來的是json數據,時間格式是正確的,那么@JsonFormat是可以正確將其轉換成Date類型的。

2.前端如果傳來的是json數據,時間格式是正確的,那么@DateTimeFormat是可以正確將其轉換成Date類型的。

3.但是,用json出參時用注解@DateTimeFormat似乎行不通,就是前面的問題,json返回Date對象時,java的序列化會把date變成一串數字,然后@dataTimeFormat似乎無法解決這個問題。

 

結論:

1.如果前后端傳的數據都是json,那么后台接數據,傳數據都可以用@JsonFormat。

2.@DateTimeFormat適合后端  接收   前端傳來的數據,不管是不是json都可以正確轉換成Date型數據,只要前端傳來的格式正確且后端@DateTimeFormat的pattern寫正確了,但是這個注解無法將Date型數據用json傳到后端去。

 


免責聲明!

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



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