Nigdy nie udało mi się to prosto za pomocą adnotacji. Aby dostać się do pracy, stworzyłem ContextResolverdla ObjectMapper, potem dodał JSR310Module( aktualizacja: teraz jest JavaTimeModulezamiast ), wraz z jeszcze jednym zastrzeżeniem, co było trzeba ustawić write-data-as-datownik na false. Zobacz więcej w dokumentacji modułu JSR310 . Oto przykład tego, czego użyłem.
Zależność
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.4.0</version>
</dependency>
Uwaga: Jednym z problemów, z którymi się spotkałem, jest to, że jackson-annotationwersja ściągnięta przez inną zależność, używana wersja 2.3.2, która anulowała 2.4 wymagane przez jsr310. To, co się stało, to dostałem NoClassDefFound dla ObjectIdResolver, czyli klasę 2.4. Musiałem więc po prostu wyrównać dołączone wersje zależności
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();
MAPPER.registerModule(new JSR310Module());
MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
}
@Override
public ObjectMapper getContext(Class<?> type) {
return MAPPER;
}
}
Klasa zasobów
@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;
}
}
Test
curl -v http://localhost:8080/api/person
Wynik: {"birthDate":"2015-03-01"}
curl -v -POST -H "Content-Type:application/json" -d "{\"birthDate\":\"2015-03-01\"}" http://localhost:8080/api/person
Wynik: 2015-03-01
Zobacz także tutaj rozwiązanie JAXB.
AKTUALIZACJA
Od JSR310Modulewersji 2.7 programu Jackson jest przestarzały. Zamiast tego powinieneś zarejestrować moduł JavaTimeModule. To wciąż ta sama zależność.