2015-12-29 4 views
3

J'essaie d'utiliser Retrofit2 avec le convertisseur Jackson et Joda DateTime. Le code que j'ai est le suivant:Retrofit: 2.0.0-beta2, JacksonConverter avec Joda DateTime

ObjectMapper mapper = new ObjectMapper(); 
mapper.registerModule(new JodaModule()); 
retrofit = new Retrofit.Builder() 
     .baseUrl(RestServiceApi.BASE_URL) 
     .addConverterFactory(JacksonConverterFactory.create(mapper)) 
     .client(okHttpClient) 
     .build(); 

Cependant, le sérialiseur Joda/désérialiseur ne sont pas utilisés pour résultat

{ 
    ........... 
    "DateTime": { 
     "centuryOfEra": 20, 
     "dayOfMonth": 29, 
     "dayOfWeek": 2, 
     "dayOfYear": 363, 
     "era": 1, 
     "hourOfDay": 8, 
     ..... 
    } 
} 

Le résultat est atteint même lors de l'utilisation sans ObjectMapper

JacksonConverterFactory.create()
.addConverterFactory(JacksonConverterFactory.create()) 

Si le même ObjectMapper est utilisé directement pour écrire la valeur dans String, tout fonctionne comme prévu.

ObjectMapper mapper = new ObjectMapper(); 
    mapper.registerModule(new JodaModule()); 
    String payload = mapper.writeValueAsString(message); 

Toute aide sera appréciée.

Edit: Dépendances:

+--- com.squareup.okhttp:okhttp:2.7.0 
| \--- com.squareup.okio:okio:1.6.0 
+--- com.squareup.okhttp:logging-interceptor:2.7.0 
| \--- com.squareup.okhttp:okhttp:2.7.0 (*) 
+--- com.squareup.retrofit:retrofit:2.0.0-beta2 
| \--- com.squareup.okhttp:okhttp:2.5.0 -> 2.7.0 (*) 
+--- com.squareup.retrofit:converter-jackson:2.0.0-beta2 
| +--- com.squareup.retrofit:retrofit:2.0.0-beta2 (*) 
| \--- com.fasterxml.jackson.core:jackson-databind:2.4.3 
|   +--- com.fasterxml.jackson.core:jackson-annotations:2.4.0 
|   \--- com.fasterxml.jackson.core:jackson-core:2.4.3 
+--- com.fasterxml.jackson.datatype:jackson-datatype-joda:2.4.3 
| +--- com.fasterxml.jackson.core:jackson-annotations:2.4.0 
| +--- com.fasterxml.jackson.core:jackson-core:2.4.3 
| +--- com.fasterxml.jackson.core:jackson-databind:2.4.3 (*) 
| \--- joda-time:joda-time:2.2 -> 2.3 
+--- com.box:json-schema-validator:2.2.10 
| +--- joda-time:joda-time:2.3 

Edit2: J'ai enlevé le joda temps: 2,3 dépendance à aucun résultat.

+0

Veuillez fournir les versions exactes des bibliothèques que vous utilisez. Notez également que l'exemple suivant fonctionne comme prévu https://gist.github.com/miensol/e4e5fed9c36a75feb3cc – miensol

+0

Fourni dans Modifier. – JFreeman

Répondre

0

Même avec Retrofit2.0-beta3, je n'ai pas réussi à faire fonctionner le code ci-dessus.

j'ai fini à l'aide explicite sérialiseur/désérialiseur sur chaque champ de type DateTime:

@JsonProperty("DateTime") 
@NotNull 
@JsonDeserialize(using = CustomDateTimeDeserializer.class) 
@JsonSerialize(using = CustomDateTimeSerializer.class) 
private Date DateTime; 

Code sérialiseur:

public class CustomDateTimeSerializer extends StdScalarSerializer<DateTime> { 

public CustomDateTimeSerializer() { 
    super(DateTime.class); 
} 

@Override 
public void serialize(DateTime dateTime, 
         JsonGenerator jsonGenerator, 
         SerializerProvider provider) throws IOException, JsonGenerationException { 
    DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss").withZone(DateTimeZone.forID("Europe/London")); 
    String dateTimeAsString = fmt.print(dateTime); 
    jsonGenerator.writeString(dateTimeAsString); 
} 

}

Code désérialiseur:

public class CustomDateTimeDeserializer extends StdScalarDeserializer<DateTime> { 

public CustomDateTimeDeserializer() { 
    super(DateTime.class); 
} 

@Override 
public DateTime deserialize(JsonParser jsonParser, 
          DeserializationContext deserializationContext) throws IOException, JsonProcessingException { 
    JsonToken currentToken = jsonParser.getCurrentToken(); 
    if (currentToken == JsonToken.VALUE_STRING) { 
     String dateTimeAsString = jsonParser.getText().trim(); 
     DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss").withZone(DateTimeZone.forID("Europe/London")); 
     DateTime result = fmt.parseDateTime(dateTimeAsString); 
     return result; 
    } 
    throw deserializationContext.mappingException(getValueClass()); 
} 

}