覆盖 Groovy 的 java.util.Date toString 方法
Overriding Groovy's java.util.Date toString method
我有一个 Grails(版本 2.5.0;Groovy 版本 2.4.3)应用程序,其中我有一个 CustomPropertyEditorRegistry 在使用字段值时覆盖日期格式。
我安装了 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 控制台插件):
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
任何帮助解决自定义 属性 问题 and/or 覆盖 Date 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 code/output:
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() ,除非我做错了什么或误解了什么。
您说您正在使用 Groovy 控制台,但您的意思是您正在 运行 宁 grails console
,对吧? BootStrap 在启动控制台时不会 运行,仅在 run-app
和测试中。如果您 运行 在控制台中覆盖 toString
然后 运行 您的示例代码应该可以正常工作。
只是想到“as String
”
.. 如果你重新定义 asType
方法:
Date.metaClass.asType = { Class clazz ->
return "Hello"
}
(new Date()) as String
===> Hello
但仍然:
new Date()
===> Wed Jul 01 20:12:35 EEST 2015
因为我找不到覆盖的任何错误,而且它在单独打印实例时确实有效 new Date()
,我认为问题是 Java 正在调用 toString()
方法,而不是让 Groovy 控制方法调用过程,这将导致执行 asType()
和 toString()
覆盖的方法。我不确定是否有一个干净的解决方法,我仍然不确定为什么自定义 属性 编辑器在安装 ElasticSearch 插件后停止工作。
我有一个 Grails(版本 2.5.0;Groovy 版本 2.4.3)应用程序,其中我有一个 CustomPropertyEditorRegistry 在使用字段值时覆盖日期格式。
我安装了 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 控制台插件):
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
任何帮助解决自定义 属性 问题 and/or 覆盖 Date 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 code/output:
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() ,除非我做错了什么或误解了什么。
您说您正在使用 Groovy 控制台,但您的意思是您正在 运行 宁 grails console
,对吧? BootStrap 在启动控制台时不会 运行,仅在 run-app
和测试中。如果您 运行 在控制台中覆盖 toString
然后 运行 您的示例代码应该可以正常工作。
只是想到“as String
”
.. 如果你重新定义 asType
方法:
Date.metaClass.asType = { Class clazz ->
return "Hello"
}
(new Date()) as String
===> Hello
但仍然:
new Date()
===> Wed Jul 01 20:12:35 EEST 2015
因为我找不到覆盖的任何错误,而且它在单独打印实例时确实有效 new Date()
,我认为问题是 Java 正在调用 toString()
方法,而不是让 Groovy 控制方法调用过程,这将导致执行 asType()
和 toString()
覆盖的方法。我不确定是否有一个干净的解决方法,我仍然不确定为什么自定义 属性 编辑器在安装 ElasticSearch 插件后停止工作。