Tôi không bao giờ có thể làm cho nó hoạt động đơn giản bằng cách sử dụng các chú thích. Để làm cho nó hoạt động, tôi đã tạo một ContextResolver
for ObjectMapper
, sau đó tôi đã thêm JSR310Module
( cập nhật: bây giờ là JavaTimeModule
thay thế ), cùng với một cảnh báo nữa, đó là cần phải đặt dấu thời gian ghi là sai thời gian. Xem thêm tại tài liệu cho mô-đun JSR 310 . Đây là một ví dụ về những gì tôi đã sử dụng.
Phụ thuộc
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.4.0</version>
</dependency>
Lưu ý: Một vấn đề tôi gặp phải với điều này là jackson-annotation
phiên bản được kéo vào bởi một phụ thuộc khác, phiên bản 2.3.2 đã sử dụng, đã hủy bỏ phiên bản 2.4 theo yêu cầu của jsr310
. Điều xảy ra là tôi đã nhận được NoClassDefFound ObjectIdResolver
, đây là lớp 2.4. Vì vậy, tôi chỉ cần xếp hàng các phiên bản phụ thuộc được bao gồm
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;
}
}
Lớp tài nguyên
@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;
}
}
Kiểm tra
curl -v http://localhost:8080/api/person
Kết quả: {"birthDate":"2015-03-01"}
curl -v -POST -H "Content-Type:application/json" -d "{\"birthDate\":\"2015-03-01\"}" http://localhost:8080/api/person
Kết quả: 2015-03-01
Xem thêm tại đây để biết giải pháp JAXB.
CẬP NHẬT
Phiên bản JSR310Module
này không được dùng nữa trong phiên bản 2.7 của Jackson. Thay vào đó, bạn nên đăng ký mô-đun JavaTimeModule
. Nó vẫn là sự phụ thuộc tương tự.