Grails не может отменить вывод даты / времени из JSON обратно в joda DateTime - PullRequest
2 голосов
/ 20 декабря 2011

У меня проблемы с использованием плагина JodaTime для Grails.Кажется, что плагин правильно конвертирует в JSON для вывода, но он не может снова принять формат выходной даты в качестве ввода, когда тот же объект 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.В действительности, два поля даты, которые вызывают проблемы, должны обрабатываться на 100% внутри GORM, и я бы предпочел, чтобы контроллер полностью их игнорировал, но будут другие поля даты, подобные им, которые необходимо будет обновить, как только модель домена получитзаполнено.

Как получить автоматический демонтаж JSON для правильного преобразования обратно в объекты DateTime времени joda?

Примечание. В настоящее время это является проверкой концепции приложения клиент-сервер..

1 Ответ

3 голосов
/ 20 декабря 2011

Я не уверен ни в причине, ни в том, почему это исправление работает, но добавление jodatime.format.html5 = true в файл Config.groovy заставляет все работать.

Насколько я могу судить, в выводе JSON нет изменений, но по какой-то причине он обеспечивает обработку ввода JSON и привязку данных.

Единственное подобие документации, которое даже намекает на это, - здесь .

Попытка установить формат для DateTime с помощью чего-то вроде jodatime.format.org.joda.time.DateTime = "yyyy-MM-dd'T'HH:mm:ss.SSSZZ" не имела никакого эффекта.

...