2014-03-25 14 views
5

Ich habe versucht, eine Klasse mit einem DateTime- als attibute deserialisieren:joda.time.DateTime Deserialisierung Fehler

import org.joda.time.DateTime; 
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; 
import com.fasterxml.jackson.databind.annotation.JsonSerialize; 
import com.fasterxml.jackson.datatype.joda.deser.DateTimeDeserializer; 
import com.fasterxml.jackson.datatype.joda.ser.DateTimeSerializer; 

class MyClass { 

    private DateTime alertTimestamp; 

    private String name; 

    @JsonSerialize(using = DateTimeSerializer.class) 
    public DateTime getAlertTimestamp() { 
     return alertTimestamp; 
    } 

    @JsonDeserialize(using = DateTimeDeserializer.class) 
    public void setAlertTimestamp(DateTime now) { 
     this.alertTimestamp = now; 
    } 

    //... 
} 

Aber wenn ich tro deserialize versuchen, habe ich diese Ausnahme:

com.fasterxml.jackson.datatype.joda.deser.DateTimeDeserializer has no default (no arg) constructor 

Ich benutze dass deserialisieren:

ObjectMapper mapper = new ObjectMapper(); 
mapper.readValue(jsonData, MyClass.class); 

Und ein Beispiel für meine jsonData:

{  
    "name":"test", 
    "alertTimestamp":  {"year":2014,"era":1,"dayOfMonth":24,"dayOfWeek":1,"dayOfYear":83,"weekOfWeekyear":13,"weekyear":2014,"monthOfYear":3,"yearOfEra":2014,"yearOfCentury":14,"centuryOfEra":20,"millisOfSecond":232,"millisOfDay":45143232,"secondOfMinute":23,"secondOfDay":45143,"minuteOfHour":32,"minuteOfDay":752,"hourOfDay":12,"zone":{"uncachedZone":{"cachable":true,"fixed":false,"id":"America/Los_Angeles"},"fixed":false,"id":"America/Los_Angeles"},"millis":1395689543232,"chronology":{"zone":{"uncachedZone":{"cachable":true,"fixed":false,"id":"America/Los_Angeles"},"fixed":false,"id":"America/Los_Angeles"}},"afterNow":false,"beforeNow":false,"equalNow":true} 
} 
+0

Kannst du 'timestamp' vs' alertTimestamp' klären? –

+0

Entschuldigung, es war ein Fehler – hedi691

+0

Welcher JSON-Generator erzeugte den JSON in 'jsonData'? 'DateTimeSerializer' wird nicht in dieses Format serialisiert. –

Antwort

8

@JsonDeserialize erwartet eine mit einem Argumenten-Konstruktor. Die neueste Version von DateTimeDeserializer hat keinen solchen Konstruktor.

Wenn Sie das Format korrigiert haben, dh. alertTimestamp sollte nur ein Zeitstempel sein, dann könnten Sie einfach die JodaModule mit der ObjectMapper registrieren. Es wird DateTimeDeserializer intern für DateTime Felder verwenden. Sie können die @JsonDeserialize Annotationen loswerden.

mapper.registerModule(new JodaModule()); 

Sie müssen die jackson-datatype-joda Bibliothek hinzuzufügen.

+0

Könnten Sie bitte ein Beispiel geben? –

+0

@arcone Woran möchten Sie ein Beispiel sehen? –

+0

Ich habe es herausgefunden - es war ein Spring-Response-Problem mit DateTime. –