getModel,字段里有Date类型遇到的麻烦。

会哭的鳄鱼 发布于 2016/07/16 12:00
阅读 199
收藏 0

@JFinal ,我现在遇到一个麻烦,数据库oracle,表里有一个字段是Date,我们都知道oracle的date字段是存年月日时分秒的。但实际上我是要保存年月日就ok了,时分秒部分都是00:00:00就行了。页面上我放了一个日期选择框(第三方的UI),可以让用户输入一个日期,也可以选择一个日期,这个输入的日期是有年月日,没有时分秒。也就是说,传到后台的该字段只有类似yyyy-mm-dd部分。在后台,我getmodel的时候,就报错了。原本我想getmodel后,把这个字段手动调整一下,但现在根本不给我这个机会,getmodel的时候,就抛异常了。

当然,我可以在客户端让用户选择的时候是带时分秒的,但毕竟这个字段里不需要时分秒,界面看起来就会很别扭。

咋办?

加载中
0
JFinal
JFinal
    如果你的日期类型是 yyyy-mm-dd格式,getModel 应该是支持,jfinal 会对日期型参数进行长度判断,如果长度不包含时分秒的长,那么按 yyyy-mm-dd 去转换。所以,建议打开 chrome 看一下具体的请求参数是不是满足了 yyyy-mm-dd 格式。如果有问题,再来反馈,还可以继续深入解决
0
yak
yak
封装得太狠就没有灵活性了
0
会哭的鳄鱼
会哭的鳄鱼

@JFinal ,我刚刚跟踪了这个问题,客户端传递过来的model里出生日期字段传递过来的就是yyyy-mm-dd格式的,

提交到后台,后台获得的日期也是2016-07-18,具体看图:

但执行到下一句,getModel的时候,会抛异常了,

@Jfinal ,你看看是不是有问题呢,还是我做的不对了?

JFinal
JFinal
你用的 jfinal 老版本吧? 新版本对日期型长度做了判断,你传入的日期长度太短的化会按 Data去转,长的话才去按 Timestamp 去转。你用的哪个版本?
0
会哭的鳄鱼
会哭的鳄鱼

@JFinal ,刚我又跟踪了代码,发现你的程序可能是没处理这个状况,看看代码:

然后跟踪到convert方法里面,执行到如下代码了:

这里直接对传进来的日期字符串调用java.sql.Timestamp.valueOf方法,就抛异常了。因为格式不对,这里是不是应该判断一下s的长度,如果是yyyy-mm-dd,就强制并上00:00:00呢?

0
会哭的鳄鱼
会哭的鳄鱼

@JFinal 我修改了这个代码,不知道会不会出问题,请你评估一下!

我直接这样修改,编译成class文件后替换掉了jfnal2.0的jar包里,目前我自己在我的程序里测试是可以通过的,不知道这样写会不会有什么隐患,请波总指导评估一下!

0
JFinal
JFinal

引用来自“会哭的鳄鱼”的评论

@JFinal 我修改了这个代码,不知道会不会出问题,请你评估一下!

我直接这样修改,编译成class文件后替换掉了jfnal2.0的jar包里,目前我自己在我的程序里测试是可以通过的,不知道这样写会不会有什么隐患,请波总指导评估一下!

     根据长度判断再转换,做这么个适配不会有隐患,实际上 jfinal 2.2 已经是这样做的了,你用的 jfinal 2.0 所以会抛异常,这个版本是按严格地类型转化的。

     建议直接升级到 jfinal 2.2,这样更彻底

JFinal
JFinal
回复 @会哭的鳄鱼 : http://www.oschina.net/news/69461/jfinal-2-1-released http://www.oschina.net/news/69785/jfinal-2-1-final http://www.oschina.net/news/70001/jfinal-2-2
会哭的鳄鱼
会哭的鳄鱼
回复 @JFinal : 能给个2.2的发布新闻链接吗?一时找不到了,jfinal主页上也没有
JFinal
JFinal
回复 @会哭的鳄鱼 : 基本上可以平滑升级,要改变的地方不多,也很容易改,基本只是改改法法名之类的。具体要改的地方,看一下 change log,在 osc 的新版本发布新闻中有所有的 change log
会哭的鳄鱼
会哭的鳄鱼
明白了!我的2.0下写的代码,可以无缝升级到2.2吗?我暂时不想用baseModel的bean类。并且,我的model都是我自己写的自动生成代码生成的。
0
Jim_Ai
Jim_Ai

引用来自“会哭的鳄鱼”的评论

@JFinal ,刚我又跟踪了代码,发现你的程序可能是没处理这个状况,看看代码:

然后跟踪到convert方法里面,执行到如下代码了:

这里直接对传进来的日期字符串调用java.sql.Timestamp.valueOf方法,就抛异常了。因为格式不对,这里是不是应该判断一下s的长度,如果是yyyy-mm-dd,就强制并上00:00:00呢?

直接拼上00:00:00还是不够严谨的,比方说页面上用了bootstrap的datetimepicker控件,只有年月日时分。还是会出错。正确应该是参考2.2

// mysql type: timestamp, datetime
if (type == java.sql.Timestamp.class) {
if (s.length() >= timeStampLen) {
return java.sql.Timestamp.valueOf(s);
}
else {
return new java.sql.Timestamp(new SimpleDateFormat(datePattern).parse(s).getTime());
}
}

返回顶部
顶部