2011-12-19 2 views
2

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.

Répondre

3

Je ne suis pas sûr de la cause, ni pourquoi ce correctif fonctionne, mais l'ajout de jodatime.format.html5 = true au fichier Config.groovy fait tout fonctionner. Pour autant que je sache, il n'y a pas de changement dans la sortie JSON, mais pour une raison quelconque, cela fait fonctionner la gestion des entrées JSON et la liaison de données.

Le seul semblant de documentation qui fait allusion à cela est here.

Essayer de définir le format pour DateTime via quelque chose comme jodatime.format.org.joda.time.DateTime = "yyyy-MM-dd'T'HH:mm:ss.SSSZZ" n'a eu aucun effet.

Questions connexes