文档章节

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 框架 Java扩展

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

lyuehh
2010/07/26
1K
2
中英文对照 介绍Play Framework 框架的控制器(Controller)

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

红薯
2010/07/07
5.5K
13
使用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

没有更多内容

加载失败,请刷新页面

加载更多

可爱的python测试开发库(python测试开发工具库汇总)

欢迎转载,转载请注明来源: github地址 谢谢点赞 本文地址 相关书籍下载 测试开发 Web UI测试自动化 splinter - web UI测试工具,基于selnium封装。 链接 selenium - web UI自动化测试。 链...

python测试开发人工智能安全
今天
2
0
Shiro | 实现权限验证完整版

写在前面的话 提及权限,就会想到安全,是一个十分棘手的话题。这里只是作为学校Shiro的一个记录,而不是,权限就应该这样设计之类的。 Shiro框架 1、Shiro是基于Apache开源的强大灵活的开源...

冯文议
今天
1
0
linux 系统的运行级别

运行级别 运行级别 | 含义 0 关机 1 单用户模式,可以想象为windows 的安全模式,主要用于修复系统 2 不完全的命令模式,不含NFS服务 3 完全的命令行模式,就是标准的字符界面 4 系统保留 5 ...

Linux学习笔记
今天
2
0
学习设计模式——命令模式

任何模式的出现,都是为了解决一些特定的场景的耦合问题,以达到对修改封闭,对扩展开放的效果。命令模式也不例外: 命令模式是为了解决命令的请求者和命令的实现者之间的耦合关系。 解决了这...

江左煤郎
今天
3
0
字典树收集(非线程安全,后续做线程安全改进)

将500W个单词放进一个数据结构进行存储,然后进行快速比对,判断一个单词是不是这个500W单词之中的;来了一个单词前缀,给出500w个单词中有多少个单词是该前缀. 1、这个需求首先需要设计好数据结...

算法之名
昨天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部