grails rest client将字符串转换为java.util.Date

时间:2016-07-14 14:19:22

标签: json rest date grails format

我试图使用在grails 2.5.5中创建的rest-service,它具有Date属性,如下所示:

import grails.rest.*

@Resource(uri='/restDomain', readOnly=true)
class RestDomain {
    Date myDate
}

但是当从另一个grails应用程序(v2.5.5或v3.1.9)调用时,这样:

new RestBuilder().get('http://localhost:8080/restApp/restDomain.json').json.collect {
    new RestDomain(it)
}

我收到Cannot cast object '2016-01-20T12:36:57Z' with class 'java.lang.String' to class 'java.util.Date'错误。

我已经在文件最底部的application.yml(grails v3.1.9)中添加了这个

---
grails:
    databinding:
        dateFormats:
            - yyyy-MM-dd'T'HH:mm:ssX
            - yyyy-MM-dd'T'HH:mm:ss.SSSX

这在Config.groovy(grails v2.5.5)

grails.databinding.dateFormats = ["yyyy-MM-dd'T'HH:mm:ssX", "yyyy-MM-dd'T'HH:mm:ss.SSSX"]

但似乎并没有起作用

注意:在两个客户端应用程序中,我都有相应的src/groovy/restApp/RestDomain.groovy类,如下所示:

package restApp

class RestDomain {
    Date myDate
}

注意2:grails 3.1.9客户端应用程序在build.gradle依赖项部分中具有compile 'org.grails:grails-datastore-rest-client:6.0.0.M1'依赖性,并且Grails 2.5.5客户端应用程序在BuildConfig.groovy插件部分中具有compile ':rest-client-builder:2.1.1' < / p>

任何帮助它在Grails 2.5.x或Grails 3.1.x应用程序中工作都将非常感激

2 个答案:

答案 0 :(得分:0)

日期字符串末尾的“Z”表示时区为UTC,这不是您可以使用时间格式中的“X”进行解析的有效ISO 8601 time zone specification。这是一个应该用

解析的文字
yyyy-MM-dd'T'HH:mm:ss'Z'

答案 1 :(得分:0)

添加答案以提供解决方法以解决此问题,但我不会将其标记为已接受的答案,因为它不是解决问题的理想方法,因此它是:

在我的客户端控制器中添加了这个(我猜这里的bindData方法是关键):

new RestBuilder().get('http://localhost:8080/restApp/restDomain.json').json.collect {
    def restDomainInstance = new RestDomain()
    bindData(restDomainInstance, it)
    restDomainInstance
}

并将RestDomain.groovy更改为此

package restApp

import java.text.SimpleDateFormat
import org.grails.databinding.BindUsing

class RestDomain {
    @BindUsing({ obj, source ->
        new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX")
            .parse(source.getPropertyValue('myDate'))
    })
    Date myDate
}

SimpleDateFormat中的X用于将时区识别为UTC,因此jvm稍后将其转换为当前时区(在我的情况下:-04:00 GMT)