文档章节

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

奋斗到天明
 奋斗到天明
发布于 2015/08/27 18:09
字数 607
阅读 39
收藏 0
点赞 0
评论 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 ⋅ 2

中英文对照 介绍Play Framework 框架的控制器(Controller)

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

红薯 ⋅ 2010/07/07 ⋅ 13

play框架之环境搭建

项目主页: http://www.playframework.org/ 项目简介: Play!是一个full-stack(全栈的)Java Web应用框架,包括一个简单的无状态MVC模型,具有Hibernate的对象持续,一个基于Groovy的模板引...

jeffsui ⋅ 2012/03/07 ⋅ 2

使用Windows8开发Metro风格应用四

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

晨曦之光 ⋅ 2012/06/07 ⋅ 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 ⋅ 20

play 的类型转换

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

88diy ⋅ 2011/08/19 ⋅ 3

Intellij Idea 配置 Play 1.x Framework 开发环境 (configuration Play 1 x Framework development environmen...

虽然在公司使用的是Eclipse,但是我还是很中意俊俏的Intellij Idea(当然还有风骚的Sublime Text),Play 是一个类ROR的框架(Play 1.x 是比较正统的Java框架,Play 2.x混入Scala血统,个人不...

刀狂剑痴 ⋅ 2015/08/27 ⋅ 0

从Spring + Ejb + Struts2 迁移到Play 1.x 框架 之一

原来项目比较古老,前台是用delphi,后台有用Ejb做……这货已经很少有人见过了……,现在公司主要项目都转到play上,所以这个项目也重构。 第一阶段是将SSE 迁移到play,尽量不改动代码,只要...

刀狂剑痴 ⋅ 2015/08/27 ⋅ 0

关于Play(Play 2.0 介绍)

Play 2.0 介绍 2007开始,我们一直致力于让Java开发web应用更容易。Play始于一个内部项目Zenexity,它深刻影响了我们开发web项目的方式:关注开发者生产力,遵循web架构的特点,并打破常规,...

大东哥 ⋅ 2012/03/19 ⋅ 0

greenlaw110/Rythm

Rythm A "Razor" like, rich featured, high performance and easy to use Java template engine Links: The documentation The fiddle site Integrations play-rythm for Play!Framework 1.......

greenlaw110 ⋅ 2015/05/06 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 38分钟前 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

Linux系统日志

linux 系统日志 /var/log/messages /etc/logrotate.conf 日志切割配置文件 https://my.oschina.net/u/2000675/blog/908189 logrotate 使用详解 dmesg 命令 /var/log/dmesg 日志 last命令,调......

Linux学习笔记 ⋅ 昨天 ⋅ 0

MVC——统一报文格式的异常处理响应

在我们写controller层的时候,常常会有这样的困惑,如果需要返回一个数据是,可能为了统一回去构造一个类似下列的数据格式: { status:true, msg:"保存成功!", data:[]} 而且在写...

alexzhu592 ⋅ 昨天 ⋅ 0

[知乎]SSH框架

网上图书馆管理系统包括管理员管理和图书管理,图书借阅,查询模块等等,网上商城包括前台页面和后台管理页面,两个都是以前别人的实际项目,只是别人用的不是SSH,我把他们改用SSH了,除了S...

颖伙虫 ⋅ 昨天 ⋅ 0

android -------- 打开本地浏览器或指定浏览器加载,打电话,打开第三方app

开发中常常有打开本地浏览器加载url或者指定浏览器加载, 还有打开第三方app, 如 打开高德地图 百度地图等 在Android程序中我们可以通过发送隐式Intent来启动系统默认的浏览器。 如果手机本身...

切切歆语 ⋅ 昨天 ⋅ 0

linux 安装docker

通过以下命令下载安装docker wget -qO- https://get.docker.com | sh 执行以上命令后输出以下内容说明安装成功,注意红框中的内容,docker安装成功后默认只有root能使用,红框中给出的提示是...

haoyuehong ⋅ 昨天 ⋅ 0

482. License Key Formatting - LeetCode

Question 482. License Key Formatting Solution 思路:字符串转化为char数组,从后遍历,如果是大写字母就转化为小写字母,如果是-就忽略,如果遍历了k个字符(排除-)就追加一个-。 Java实现...

yysue ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部