Je n'ai jamais pu faire fonctionner cela simplement en utilisant des annotations. Pour le faire fonctionner, j'ai créé un ContextResolverfor ObjectMapper, puis j'ai ajouté le JSR310Module( update: now it is JavaTimeModuleinstead ), avec une autre mise en garde, qui était la nécessité de définir write-date-as-timestamp sur false. Pour en savoir plus, consultez la documentation du module JSR310 . Voici un exemple de ce que j'ai utilisé.
Dépendance
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.4.0</version>
</dependency>
Remarque: un problème auquel j'ai été confronté est que la jackson-annotationversion extraite par une autre dépendance, utilisait la version 2.3.2, qui annulait la version 2.4 requise par le jsr310. Ce qui s'est passé, c'est que j'ai obtenu un NoClassDefFound pour ObjectIdResolver, qui est une classe 2.4. J'avais donc juste besoin d'aligner les versions de dépendances incluses
ContexteResolver
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JSR310Module;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {
private final ObjectMapper MAPPER;
public ObjectMapperContextResolver() {
MAPPER = new ObjectMapper();
// Now you should use JavaTimeModule instead
MAPPER.registerModule(new JSR310Module());
MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
}
@Override
public ObjectMapper getContext(Class<?> type) {
return MAPPER;
}
}
Classe de ressources
@Path("person")
public class LocalDateResource {
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getPerson() {
Person person = new Person();
person.birthDate = LocalDate.now();
return Response.ok(person).build();
}
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response createPerson(Person person) {
return Response.ok(
DateTimeFormatter.ISO_DATE.format(person.birthDate)).build();
}
public static class Person {
public LocalDate birthDate;
}
}
Tester
curl -v http://localhost:8080/api/person
Résultat: {"birthDate":"2015-03-01"}
curl -v -POST -H "Content-Type:application/json" -d "{\"birthDate\":\"2015-03-01\"}" http://localhost:8080/api/person
Résultat: 2015-03-01
Voir aussi ici pour la solution JAXB.
METTRE À JOUR
Le JSR310Moduleest obsolète à partir de la version 2.7 de Jackson. Au lieu de cela, vous devez enregistrer le module JavaTimeModule. C'est toujours la même dépendance.