关于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传到后端去。