Nunca pude hacer que esto funcionara de manera simple usando anotaciones. Para conseguir que funcione, he creado una ContextResolverpara ObjectMapper, a continuación, he añadido el JSR310Module( actualización: ahora es JavaTimeModulesu lugar ), junto con una advertencia más, lo cual era la necesidad de fijar la fecha de escritura-como-marca de tiempo en false. Vea más en la documentación para el módulo JSR310 . Aquí hay un ejemplo de lo que usé.
Dependencia
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.4.0</version>
</dependency>
Nota: Un problema que enfrenté con esto es que la jackson-annotationversión extraída por otra dependencia, utilizó la versión 2.3.2, que canceló la 2.4 requerida por el jsr310. Lo que sucedió fue que obtuve un NoClassDefFound para ObjectIdResolver, que es una clase 2.4. Así que solo necesitaba alinear las versiones de dependencia incluidas
ContextResolver
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;
}
}
Clase de recursos
@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;
}
}
Prueba
curl -v http://localhost:8080/api/person
Resultado: {"birthDate":"2015-03-01"}
curl -v -POST -H "Content-Type:application/json" -d "{\"birthDate\":\"2015-03-01\"}" http://localhost:8080/api/person
Resultado: 2015-03-01
Consulte también aquí la solución JAXB.
ACTUALIZAR
El JSR310Moduleestá en desuso a partir de la versión 2.7 de Jackson. En su lugar, debe registrar el módulo JavaTimeModule. Sigue siendo la misma dependencia.