覆盖Groovy的java.util.Date toString方法

时间:2015-06-12 16:49:09

标签: grails groovy elasticsearch

我有一个Grails(版本2.5.0; Groovy版本2.4.3)应用程序,其中我使用CustomPropertyEditorRegistry来覆盖使用fieldvalue时的日期格式。

我安装了ElasticSerach Grails插件版本0.0.4.4,安装后我注意到自定义属性编辑器不再工作了。为了暂时解决这个问题,我决定使用Groovy的元编程简单地覆盖java.util.Date的toString()方法。

我将此添加到Bootstrap.groovy:

Date.metaClass.toString = {
   return delegate.format("MM/dd/yyyy HH:mm")
}

但是,当我访问Grails控制台时(使用Grails Console插件):

new Date("Fri Jun 12 12:36:02 EDT 2015") as String == "Fri Jun 12 12:36:02 EDT 2015"
new Date("Fri Jun 12 12:36:02 EDT 2015").toString() == "06/12/2015 12:36"

println(new Date("Fri Jun 12 12:36:02 EDT 2015")) // prints Fri Jun 12 12:36:02 EDT 2015
println(new Date("Fri Jun 12 12:36:02 EDT 2015").toString()) // prints 06/12/2015 12:36 

任何帮助搞清楚自定义属性问题和/或覆盖日期toString()将不胜感激。我在ElasticSearch Grails插件GitHub上打开了一个问题,问题#115也是

修改

我已经用Grails和Groovy进行了一些测试。

我在Bootstrap.groovy中使用此代码创建了一个新的Grails 2.5.0应用程序:

Date.metaClass.toString = {
    return delegate.format("MM/dd/yyyy HH:mm")
}

并将其添加到index.gsp视图中:

<ul>
    <li>new Date().toString() == ${new Date().toString()}</li>
    <li>new Date() == ${new Date()}</li>
    <li>new Date() as String == ${new Date() as String}</li>
</ul>

/*Output:
new Date().toString() == 06/15/2015 10:32
new Date() == Mon Jun 15 10:32:33 EDT 2015
new Date() as String == Mon Jun 15 10:32:33 EDT 2015
*/

我还使用Groovy版本2.4.3使用此代码/输出启动了groovyConsole:

Date.metaClass.toString = {
    return delegate.format("MM/dd/yyyy HH:mm")
}

println(new Date())
println(new Date() as String)
println(new Date().toString())

/*Output:
06/15/2015 10:38
Mon Jun 15 10:38:12 EDT 2015
Mon Jun 15 10:38:12 EDT 2015
*/

所以这似乎是Groovy中的一个不一致,它没有从修改过的元类方法调用toString(),除非我做错了什么或误解了什么。

3 个答案:

答案 0 :(得分:2)

你说你正在使用Groovy控制台,但你的意思是你正在运行grails console,对吧?启动控制台时,BootStrap不会在run-app和测试中运行。如果您在控制台中运行toString覆盖,然后运行示例代码,它应该可以正常工作。

答案 1 :(得分:1)

只是想一想&#34; as String&#34;  ..如果您重新定义asType方法:

Date.metaClass.asType = { Class clazz ->
 return "Hello"
}

(new Date()) as String
===> Hello

但仍然:

new Date()
===> Wed Jul 01 20:12:35 EEST 2015

答案 2 :(得分:0)

由于我无法找到覆盖的任何问题,并且在单独打印实例new Date()时它确实有效,我相信问题是Java直接调用toString()方法而不是让Groovy控制方法调用过程,这将导致执行asType()toString()重写方法。我不确定是否有一个干净的解决方法,我仍然不确定为什么自定义属性编辑器在安装ElasticSearch插件时停止工作。