J'ai des problèmes pour utiliser le plugin JodaTime pour Grails. Le plugin semble être correctement converti en JSON pour la sortie, mais il ne semble pas être en mesure d'accepter à nouveau le format de sortie en entrée lorsque le même objet JSON est renvoyé.Grails ne peut pas unmarshall date/heure de JSON de retour dans joda DateTime
Ce sont les erreurs que je reçois :
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>
Voici le modèle de domaine très basique:
package server
import org.joda.time.DateTime
class Session {
DateTime dateCreated
DateTime lastUpdated
String ip
static constraints = {
ip blank: false
}
}
et voici les méthodes d'exposition et de mise à jour (envoyer et recevoir JSON respectivement):
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)
}
Je ne suis pas sûr de ce que je dois faire pour corriger ceci, ou même si je fais les choses correctement, puisque je suis très nouveau à Grails. En réalité, les deux champs de date qui causent des problèmes devraient être gérés 100% en interne par GORM et je préférerais que le contrôleur les ignore complètement, mais il y aura d'autres champs de date comme ceux-ci qui devront être mis à jour une fois le modèle de domaine
Comment faire pour que le fichier JSON automatique soit correctement converti en objets DateTime joda?
Remarque: Ceci est actuellement une preuve de concept pour une application client-serveur.