2017-06-02 1 views
2

Nous avons un DTO défini avec un LocalDate:Jackson mappeur se développe LocalDate

@JsonProperty("dob") 
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") 
private LocalDate dob; 

Nous avons le code avec un ObjectMapper défini comme suit:

private static final ObjectMapper makeMapper() { 
    ObjectMapper mapper = new ObjectMapper(); 
    mapper.registerModule(new ParameterNamesModule()); 
    mapper.registerModule(new Jdk8Module()); 
    mapper.registerModule(new JavaTimeModule()); 
    return mapper; 
} 

Nous avons tous le cœur jackson-datababindm, jsr310 dans notre fichier pom.xml:

<!-- Jackson JSON Mapping --> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-core</artifactId> 
     <version>2.8.8</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.8.8.1</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-annotations</artifactId> 
     <version>2.8.8</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.module</groupId> 
     <artifactId>jackson-module-parameter-names</artifactId> 
     <version>2.8.8</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.datatype</groupId> 
     <artifactId>jackson-datatype-jdk8</artifactId> 
     <version>2.8.8</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.datatype</groupId> 
     <artifactId>jackson-datatype-jsr310</artifactId> 
     <version>2.8.8</version> 
    </dependency> 

Alors, quand je convertir mon objet à une chaîne JSON:

String json = makeMapper().writeValueAsString(myobject); 

Le DOB écrit à la chaîne JSON comme:

"DOB": { "année": 1964, "mois": "Février", "chronologie": { "calendarType" : "ISO8601", "id": "ISO" }, "monthValue": 2, "dayOfMonth": 13, "dayOfWeek": "jeudi", "ère": "CE", " dayOfYear ": 44, " leapYear ": true}

au lieu de: "dob": "1964-02-13" ce qui est correct. Donc, je ne sais pas comment j'ai fait cela?
Je voudrais m'assurer que la date est correctement écrite, donc je peux revenir à une date locale. Ou, y a-t-il un moyen de prendre le JSON existant (développé) et d'analyser cela en LocalDate?

Merci!

+0

Utilisez-vous JAX-RS et l'une de ses implémentations? –

+0

J'ai essayé votre code dans un nouveau projet avec ces dépendances dans 'pom.xml' et cela a bien fonctionné. Je pouvais seulement voir la sortie que vous voyez si je n'ai pas enregistré 'JavaTimeModule'. Je vous suggère de vérifier quelle autre configuration vous pourriez avoir dans votre projet ou d'autres annotations dans la classe qui contient le champ 'dob' –

+0

Nous utilisons Spring-WS, et n'utilisant aucun JAX-RS dont je suis au courant. – tjholmes66

Répondre

1

Il s'avère que c'était un problème de ClassLoader. Dans le plus petit cas, le code fonctionne et la LocalDate est transformée en JSON en conséquence. Lorsque vous avez transféré un projet dans un autre dans un autre, ce qui se passe est que l'ObjectMapper a été défini ailleurs sans JavaTimeModule.

Je pris le code:

private static final ObjectMapper makeMapper() { 
    ObjectMapper mapper = new ObjectMapper(); 
    mapper.registerModule(new ParameterNamesModule()); 
    mapper.registerModule(new Jdk8Module()); 
    mapper.registerModule(new JavaTimeModule()); 
    return mapper; 
} 

et apportèrent à droite dans ma classe où je avais besoin, et cela a fonctionné. Tendre la main à un utilitaire d'un projet différent n'a pas fonctionné pour moi.

J'espère que cela aidera quelqu'un d'autre.