2011-12-19 50 views
2

我无法为Grails使用JodaTime插件。该插件似乎正确地转换为JSON的输出,但似乎无法再接受输出的日期格式作为输入时,当相同的JSON对象被送回。Grails无法将日期/时间从JSON解析回约达日期时间

这些是我得到的错误:

Field error in object 'server.Session' on field 'lastUpdated': rejected value [2011-12-19T14:15:03-06:00]; codes [typeMismatch.server.Session.lastUpdated,typeMismatch.lastUpdated,typeMismatch.org.joda.time.DateTime,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [server.Session.lastUpdated,lastUpdated]; arguments []; default message [lastUpdated]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'org.joda.time.DateTime' for property 'lastUpdated'; nested exception is java.lang.IllegalArgumentException: Invalid format: "2011-12-19T14:15:03-06:00" is malformed at "11-12-19T14:15:03-06:00"] 
Field error in object 'server.Session' on field 'dateCreated': rejected value [2011-12-19T14:15:03-06:00]; codes [typeMismatch.server.Session.dateCreated,typeMismatch.dateCreated,typeMismatch.org.joda.time.DateTime,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [server.Session.dateCreated,dateCreated]; arguments []; default message [dateCreated]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'org.joda.time.DateTime' for property 'dateCreated'; nested exception is java.lang.IllegalArgumentException: Invalid format: "2011-12-19T14:15:03-06:00" is malformed at "11-12-19T14:15:03-06:00"] id=33 version=0> 

这里是非常基本的域模型:

package server 

import org.joda.time.DateTime 

class Session { 

    DateTime dateCreated 
    DateTime lastUpdated 
    String ip 

    static constraints = { 
     ip blank: false 
    } 
} 

这里是展示和更新方法(分别发送和接收JSON):

def show() { 
    def sessionInstance = Session.get(params.id) 
    if (!sessionInstance) { 
     flash.message = message(code: 'default.not.found.message', args: [message(code: 'session.label', default: 'Session'), params.id]) 
     redirect(action: "list") 
     return 
    } 

    def response = [sessionInstance: sessionInstance] 
    withFormat { 
     html response 
     json {render response as JSON} 
     xml {render response as XML} 
    } 
} 

def update() { 

    def sessionInstance = Session.get(params.id) 
    if (!sessionInstance) { 
     flash.message = message(code: 'default.not.found.message', args: [message(code: 'session.label', default: 'Session'), params.id]) 
     redirect(action: "list") 
     return 
    } 

    if (params.version) { 
     def version = params.version.toLong() 
     if (sessionInstance.version > version) { 
      sessionInstance.errors.rejectValue("version", "default.optimistic.locking.failure", 
        [message(code: 'session.label', default: 'Session')] as Object[], 
        "Another user has updated this Session while you were editing") 
      render(view: "edit", model: [sessionInstance: sessionInstance]) 
      return 
     } 
    } 

    sessionInstance.properties = params // <----- This is what causes the errors 

    log.info("instance: ${sessionInstance.dump()}") // <------ This is where I'm seeing the error messages 

    if (!sessionInstance.save(flush: true)) { 
     render(view: "edit", model: [sessionInstance: sessionInstance]) 
     return 
    } 

    flash.message = message(code: 'default.updated.message', args: [message(code: 'session.label', default: 'Session'), sessionInstance.id]) 
    redirect(action: "show", id: sessionInstance.id) 
} 

我不知道我需要做什么来纠正这个问题,或者即使我正确地做事,因为我对Grails很陌生。在所有现实中,导致问题的两个日期字段应该由GORM在内部100%处理,并且我宁愿控制器完全忽略它们,但是会有其他类似的日期字段,当域模型获取时需要更新填入。

我怎样才能得到自动的JSON反编组,正确地转换回乔达时间DateTime对象?

注意:这是目前客户端 - 服务器应用程序的概念验证。

回答

3

我不确定原因,也不知道此修补程序的工作原理,但将jodatime.format.html5 = true添加到Config.groovy文件会使一切正常。

据我所知,JSON输出没有变化,但无论出于何种原因,它都会使JSON输入处理和数据绑定起作用。

即使暗示这一点的文档的唯一外表是here

试图通过诸如jodatime.format.org.joda.time.DateTime = "yyyy-MM-dd'T'HH:mm:ss.SSSZZ"之类的东西来设置DateTime的格式根本没有任何效果。