zoukankan      html  css  js  c++  java
  • 关于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传到后端去。

  • 相关阅读:
    SSM环境搭建 原始xml版本
    SpringMVC 学习 十六 中初始化视图解析器过程
    tomcat中http协议的get请求与post请求 是如何携带参数的
    Apache Tomcat 7介绍
    需要补充学习内容
    IIS应用程序池配置详解及优化
    openstack l3路由模式简单理解
    openstack neutron
    openstack网络架构
    linux 统计 TCP 网络连接状态
  • 原文地址:https://www.cnblogs.com/wangshen31/p/8961691.html
Copyright © 2011-2022 走看看