Saya tidak pernah bisa membuat ini berfungsi sederhana menggunakan anotasi. Untuk membuatnya berfungsi, saya membuat ContextResolveruntuk ObjectMapper, lalu saya menambahkan JSR310Module( pembaruan: sekarang sebagai JavaTimeModulegantinya ), bersama dengan satu peringatan lagi, yang merupakan kebutuhan untuk mengatur write-date-as-timestamp menjadi false. Lihat lebih lanjut di dokumentasi untuk modul JSR310 . Ini adalah contoh dari apa yang saya gunakan.
Ketergantungan
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.4.0</version>
</dependency>
Catatan: Satu masalah yang saya hadapi dengan ini adalah bahwa jackson-annotationversi ditarik oleh ketergantungan lain, menggunakan versi 2.3.2, yang membatalkan 2.4 yang diperlukan oleh jsr310. Apa yang terjadi adalah saya mendapat NoClassDefFound untuk ObjectIdResolver, yang merupakan kelas 2.4. Jadi saya hanya perlu berbaris versi ketergantungan yang disertakan
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;
}
}
Kelas sumber daya
@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;
}
}
Uji
curl -v http://localhost:8080/api/person
Hasil: {"birthDate":"2015-03-01"}
curl -v -POST -H "Content-Type:application/json" -d "{\"birthDate\":\"2015-03-01\"}" http://localhost:8080/api/person
Hasil: 2015-03-01
Lihat juga di sini untuk solusi JAXB.
MEMPERBARUI
Itu JSR310Modulesudah ditinggalkan pada versi 2.7 dari Jackson. Sebagai gantinya, Anda harus mendaftarkan modul JavaTimeModule. Masih ketergantungan yang sama.