文档章节

Play 1.x 日期格式与参数绑定 (Play 1.x Date Format And Parameter Binding)

奋斗到天明
 奋斗到天明
发布于 2015/08/27 18:09
字数 607
阅读 40
收藏 0

昨天项目中遇到一个棘手的问题。是关于日期格式的。 

项目是前端Delphi,后端Play 1.x。在进行数据交互的时候。日期有两种格式,长格式:yyyy-MM-dd HH:mm:ss,短格式:yyyy-MM-dd。

在Play 框架对请求过来的数据进行参数绑定的时候,会将请求中的K/V字串转换为对象中规定的类型。比如日期类型Date。 Play中是支持配置统一的转换格式,在conf/application.conf中:

# Date format
# ~~~~~
date.format=yyyy-MM-dd
# date.format.fr=dd/MM/yyyy

但是,这里会有个问题。因为Play参数绑定中日期的处理是用的java.text.SimpleDateFormat类。 

如果是在Application.conf中配置的是短格式,那么如果请求是长格式的,时分秒就会被抹掉,归零。 可是如果配置长格式,那么短格式因为格式不正确,SimpleDateFormat中parse方法处理是抛异常,绑定中play会将该字段设为null。 

一开始没有想到好方法,因为项目刚刚从EJB+SSH 转移到Play 1.x上,稳定跑起来是第一,不宜动刀去修改原来的数据结构。本还想修改play的源码,而且play的日期绑定类DateBinder也相当简单,如下

public class DateBinder implements TypeBinder {

    public static final String ISO8601 = "'ISO8601:'yyyy-MM-dd'T'HH:mm:ssZ";

    public Date bind(String name, Annotation[] annotations, String value, Class actualClass, Type genericType) throws Exception {
        if (value == null || value.trim().length() == 0) {
            return null;
        }

        Date date = AnnotationHelper.getDateAs(annotations, value);
        if (date != null) {
            return date;
        }

        try {
            SimpleDateFormat sdf = new SimpleDateFormat(I18N.getDateFormat());
            sdf.setLenient(false);
            return sdf.parse(value);
        } catch (ParseException e) {
            // Ignore
        }

        try {
            SimpleDateFormat sdf = new SimpleDateFormat(ISO8601);
            sdf.setLenient(false);
            return sdf.parse(value);
        } catch (Exception e) {
            throw new IllegalArgumentException("Cannot convert [" + value + "] to a Date: " + e.toString());
        }
    }
}


但是框架一动,就动全身了。 在Google了很多也没有方法。问Play的QQ群也没有好方法。最后在刷官方文档中发现解决方法。就是As标签,官方中是这样使用。

public static void articlesSince(@As("dd/MM/yyyy") Date from) {
    List<Article> articles = Article.findBy("date >= ?", from);
    render(articles);
}


因为项目是从SSH中迁过来,所以对象中还是setter/getter模式,将As加在setter方法上能成功,加在setter的形参上则不能。

@As("yyyy-MM-dd HH:mm:ss")
public void setDepartdatetime(Date departdatetime) {
    this.departdatetime = departdatetime;
}


从这个BUG的解决方法来说,并没有什么技术含量或者说难度,但是问题的关键是问了这么多人也没人知道,只能说太忽略基础了……

© 著作权归作者所有

共有 人打赏支持
奋斗到天明
粉丝 18
博文 112
码字总数 82707
作品 0
昌平
程序员
中英文对照 介绍Play Framework 框架的控制器(Controller)

下面内容来自 Play 的官方文档中关于控制器一节的内容。 原文:http://www.playframework.org/documentation/1.0.3/controllers 翻译:红薯 (http://my.oschina.net/javayou) 转载请注明出处...

红薯
2010/07/07
5.5K
13
中英文对照 介绍Play Framework 框架 Java扩展

给Java增加的扩展方法 h1. Java extensions Java扩展给对象增加了许多方法,是之在视图模板中便利的使用,让表达式更有表现力。 Java extensions add convenience methods to objects for u...

lyuehh
2010/07/26
1K
2
使用Windows8开发Metro风格应用四

我们紧接着上篇,开始我们的Metro风格应用开发。 -----------------------------------我是华丽的分割线----------------------------------------- 12.在 XAML 中定义应用布局 a)在接下来的...

晨曦之光
2012/06/07
183
0
Play Framework 2.0 介绍

Play Framework 刚刚发布了 2.0 正式版,来看看 Play Framework 2.0 的新特性介绍吧。 原生支持 Java 和 Scala Play Framework 1.x 完全是采用 Java 编写的,可通过插件来支持 Scala,而 2....

红薯
2012/03/14
12.7K
20
play 的类型转换

在开发项目时如果将 application.conf 中的 date.format 属性设置为 date.format=yyyy-MM-dd HH:mm:ss ,那么传 yyyy-MM-dd 格式的日期,play就无法完成类型转换了;如果设置为 date.format=...

88diy
2011/08/19
396
3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

又一个centos文件顺序导致的问题

背景 新的centos似乎对于文件顺序做了特别的优化 和文件顺序出现的问题确实多了不少 centos7导致的spring循环依赖【实际上和这个问题不一样 不过由此衍生出的问题】 某应用放在新的系统开始报...

Mr_Qi
13分钟前
0
0
阿里云国际版香港CN2测评 月付9美元/30M带宽/1T流量

市面上很多家香港VPS服务商,一直都说阿里云国际版香港CN2线路好,延迟低,速度快,价格便宜流量还多,那么这个香港线路到底怎么样呢?本文从性能、延时、路由、速度方面来全方面测评一下阿里...

flyzy2005
55分钟前
0
0
撤销git commit --amend

it commit -amend之后想撤销 git reset HEAD@{1}

xiaomge
今天
0
0
有意思的TimeUnit

java.util.concurrent.TimeUnit 这个类,相信童鞋们都不陌生。它是一个enum: public enum TimeUnit 好吧,我一直把它当做一个枚举类来用。偶然看到还有别的用法,大吃一斤,原来 TimeUnit 并...

polly
今天
10
0
生成pyc

Python生成pyc文件 pyc文件是py文件编译后生成的字节码文件(byte code)。pyc文件经过python解释器最终会生成机器码运行。所以pyc文件是可以跨平台部署的,类似Java的.class文件。一般py文件改...

Mr_Tea伯奕
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部