elasticsearch,Grails,Groovy,elasticsearch" /> elasticsearch,Grails,Groovy,elasticsearch" />

Grails 覆盖Groovy';s java.util.Date toString方法

Grails 覆盖Groovy';s java.util.Date toString方法,grails,groovy,elasticsearch,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.to

我有一个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控制台插件)时:

如果您有任何关于自定义属性问题和/或覆盖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中似乎是不一致的,它没有从修改后的元类方法调用toString(),除非我做了错误的事情或误解了什么

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

只需考虑“
作为字符串”
” .. 如果重新定义
aType
方法:

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在这里引起了什么,否则
as String
变量应该会导致toString()调用。当然,它们的输出是相同的。所以我只能说Groovy本身并没有造成这种情况抱歉,你是对的。我正在使用Grails控制台插件。那么引导程序应该已经运行了,对吗?是的,因为您正在访问正在运行的应用程序。因此,如果as String应该调用.toString(),那么这里似乎仍然有问题,但是打印这两条语句时的输出是不同的(请参阅编辑以了解更多详细信息)。
Date.metaClass.asType = { Class clazz ->
 return "Hello"
}

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