Định dạng Java 8 LocalDate Jackson


138

Đối với java.util.Date khi tôi làm

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy")  
  private Date dateOfBirth;

sau đó trong yêu cầu JSON khi tôi gửi

{ {"dateOfBirth":"01/01/2000"} }  

nó hoạt động

Tôi nên làm điều này như thế nào cho trường LocalDate của Java 8 ??

Tôi đã cố gắng có

@JsonDeserialize(using = LocalDateDeserializer.class)  
@JsonSerialize(using = LocalDateSerializer.class)  
private LocalDate dateOfBirth;  

Nó không hoạt động.

Ai đó có thể vui lòng cho tôi biết những gì đúng cách để làm điều này ..

Dưới đây là phụ thuộc

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>jaxrs-api</artifactId>
     <version>3.0.9.Final</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
    <version>2.4.2</version>
</dependency>
<dependency>
    <groupId>com.wordnik</groupId>
    <artifactId>swagger-annotations</artifactId>
    <version>1.3.10</version>
</dependency>

Câu trả lời:


106

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 ContextResolverfor ObjectMapper, sau đó tôi đã thêm JSR310Module( cập nhật: bây giờ là JavaTimeModulethay 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-annotationphiê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 JSR310Modulenà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ự.


1
Xin chào Peeskillet, trường ngày sinh, đang được tạo là "ngày sinh": {"năm": 0, "tháng": "Tháng", "dayOfMonth": 0, "dayOfWeek": "DayOfWeek", "thời đại": {" value ": 0}," dayOfYear ": 0," leapYear ": false," thángValue ": 0," chronology ": {" id ":" "," calendarType ":" "}} làm thế nào tôi có thể làm cho nó chỉ là "ngày sinh" ???
JAB

Kiểm tra ContextResolver được gọi. Thêm một câu lệnh in trong getContextphương thức. Nếu phương thức này được gọi, tôi không thấy lý do nào để nó không hoạt động. Nếu nó không được gọi, thì đó có thể là thứ cần được sửa với cấu hình ứng dụng. Cho rằng tôi sẽ cần phải xem nhiều hơn những gì bạn đã cung cấp. Giống như phiên bản Resteasy, các phụ thuộc, cấu hình ứng dụng hoặc tệp web.xml hoặc lớp con Ứng dụng. Về cơ bản đủ để tái tạo vấn đề
Paul Samsotha

ContextResolver không được gọi là Peeskillet. Tôi đang phân phối lại nó trong web.xml dưới dạng <bối cảnh-param> <param-name> resteasy.resource </ param-name> <param-value> com.bac.ObjectMapperContextResolver </ param-value> </ context-param> câu hỏi cập nhật cho các phụ thuộc mà tôi đang sử dụng
JAB 2/215

Swagger dường như là vấn đề. Tôi sẽ nói để vô hiệu hóa nó nhưng nhìn thấy từ câu hỏi này, có một vấn đề đã được đưa ra, với mâu thuẫn giữa ObjectMapper của Swagger và cố gắng sử dụng câu hỏi của riêng bạn. Bạn có thể thử và vô hiệu hóa chúng, và trong ContextResolver, đặt tất cả các cấu hình thành ObjectMappernhư vênh vang (bạn có thể thấy một liên kết trong câu hỏi). Tôi không biết vì tôi không làm việc với vênh vang nhiều. Nhưng tôi nghĩ vênh vang là vấn đề chính, tại sao trình phân tích ngữ cảnh không được gọi.
Paul Samsotha

Sau khi thử nghiệm thêm, chú thích không hoạt động. Ngay cả khi chúng tôi phải sử dụng Swagger ObjectMapper, thì chúng tôi đã định cấu hình tem thời gian là sai cho chúng tôi. Vì vậy, điều này nên làm việc. Để được giúp đỡ tốt hơn, tôi thực sự khuyên bạn nên cung cấp một MCVE thể hiện vấn đề.
Paul Samsotha

95

@JsonSerialize và @JsonDeserialize hoạt động tốt với tôi. Chúng loại bỏ nhu cầu nhập mô-đun jsr 310 bổ sung:

@JsonDeserialize(using = LocalDateDeserializer.class)  
@JsonSerialize(using = LocalDateSerializer.class)  
private LocalDate dateOfBirth;

Máy khử mùi:

public class LocalDateDeserializer extends StdDeserializer<LocalDate> {

    private static final long serialVersionUID = 1L;

    protected LocalDateDeserializer() {
        super(LocalDate.class);
    }


    @Override
    public LocalDate deserialize(JsonParser jp, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        return LocalDate.parse(jp.readValueAs(String.class));
    }

}

Bộ nối tiếp:

public class LocalDateSerializer extends StdSerializer<LocalDate> {

    private static final long serialVersionUID = 1L;

    public LocalDateSerializer(){
        super(LocalDate.class);
    }

    @Override
    public void serialize(LocalDate value, JsonGenerator gen, SerializerProvider sp) throws IOException, JsonProcessingException {
        gen.writeString(value.format(DateTimeFormatter.ISO_LOCAL_DATE));
    }
}

2
Đây là câu trả lời tốt nhất cho tôi. Cảm ơn!
Romeo Jr Maranan

7
Những lớp học được bao gồm trong jackson-datatype-jsr310. Không cần phải tự xác định chúng trong dự án của bạn.
NeuroXc

1
Giải pháp này làm việc cho tôi, sử dụng các serial serial trong jackson-datatype-jsr310.
dave

2
Đây phải là câu trả lời mới tốt nhất.
Thông số bác sĩ

Nếu bạn sử dụng tuần tự hóa và giải tuần tự hóa trong jackson-datatype-jsr 310, tốt hơn nên thêm @JsonFormat (shape = JsonFormat.Shape.STRING) vào trường của bạn. Nếu không có định dạng này, giá trị sẽ được tuần tự hóa thành [năm, tháng, ngày], mặc dù quá trình khử lưu huỳnh sẽ hoạt động.
Jian Chen

74
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

làm việc tốt cho tôi


2
new com.fasterxml.jackson.datatype.jsr310.JSR310Module()cho phiên bản 2.5.4 của Jackson. Lớp JavaTimeModule không tồn tại trong phiên bản này.
dùng3774109

Câu trả lời này cũng hoạt động cho LocalDateTime(jackson 2.9.5). Cần thêm 1 phụ thuộc, vì vậy build.sbt của tôi trông như sau:"com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.9.5", "com.fasterxml.jackson.datatype" % "jackson-datatype-jsr310" % "2.9.5"
ruhong

2
Điều này nên có nhiều phiếu bầu hơn. Đơn giản và hiệu quả.
mkasberg

Làm việc hoàn hảo! Cảm ơn bạn.
MAD-HAX

Điều này chỉ cho tôi đi đúng hướng, Cảm ơn bạn! Tôi sẽ thêm rằng trong spring-boot, tất cả những gì bạn cần làm là thêm phần sau vào application.properations: spring.jackson.serialization.write-date-as-timestamp = false
Joost Lambregts

46

Trong ứng dụng web Spring Boot, với phiên bản JacksonJSR 310 "2.8.5"

compile "com.fasterxml.jackson.core:jackson-databind:2.8.5"
runtime "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.8.5"

Công @JsonFormattrình:

import com.fasterxml.jackson.annotation.JsonFormat;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
private LocalDate birthDate;

2
Liệu điều này làm việc cho khử lưu huỳnh? hoặc chỉ tuần tự hóa? Không thành công với
quá trình khử lưu huỳnh

7
Tôi đã phải tuyên bố rõ ràng trình giải @JsonDeserialize(using= LocalDateDeserializer.class)
nén

1
đơn giản nhất!
Antonio

@JsonFormatchỉ để thay đổi định dạng dữ liệu đầu ra. stackoverflow.com/a/53251526/816759 hoạt động hoàn hảo với @JsonFormat, @JsonDeserialize,@JsonSerialize
Baha

Trong Spring Boot, một khi bạn thêm phụ thuộc JSR 310, tất cả những gì bạn cần làm là thêm spring.jackson.serialization.write-dates-as-timestamps=falsevào của bạn application.propertiesvà nó yyyy-MM-ddtự động định dạng nó . Không cần@JsonFormat
esfandia

31

Giải pháp đơn giản nhất (cũng hỗ trợ giải tuần tự hóa và tuần tự hóa) là

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy")
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
private LocalDate dateOfBirth;

Trong khi sử dụng các phụ thuộc sau trong dự án của bạn.

Maven

<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-databind</artifactId>
   <version>2.9.7</version>
</dependency>
<dependency>
   <groupId>com.fasterxml.jackson.datatype</groupId>
   <artifactId>jackson-datatype-jsr310</artifactId>
   <version>2.9.7</version>
</dependency>

Học sinh lớp

compile "com.fasterxml.jackson.core:jackson-databind:2.9.7"
compile "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.7"

Không có triển khai bổ sung ContextResolver, serializer hoặc Deserializer.


Rực rỡ, xa và dễ nhất. FYI cho bất cứ ai có nhiều phụ thuộc, tôi đã phải cập nhật một số thư viện khác có tích hợp chú thích jackson.
brt

Câu trả lời này là gần nhất tôi có thể khắc phục vấn đề của tôi. Serialization đang làm việc, nhưng deserialization là không vì mô hình tôi đã sử dụng với @JsonFormat tôi nghĩ rằng (@JsonFormat (hình dạng = JsonFormat.Shape.STRING, mẫu = "dd-MM-yyyy_HH: mm: SS".)
fsakiyama

Nếu bạn đã khử lưu huỳnh không thành công, rất có thể là bạn ObjectMapperđã không JavaTimeModuleđăng ký. Nếu đối tượng ObjectMapper của bạn được cung cấp từ khung công tác spring / MessageConverter. Họ đã làm một số phép thuật để nối chúng lại. Trong trường hợp khác, nên registerModulebật LocalDateDeserializertheo mặc định cho tất cả "LocalDate" trong POJO
Dennis C

19

LocalDateSerializerbiến nó thành "[năm, tháng, ngày]" (một mảng json) thay vì "năm-tháng-ngày" (chuỗi json) theo mặc định và vì tôi không muốn yêu cầu bất kỳ ObjectMapperthiết lập đặc biệt nào (bạn có thể làm LocalDateSerializertạo ra chuỗi nếu bạn vô hiệu hóa SerializationFeature.WRITE_DATES_AS_TIMESTAMPSnhưng điều đó đòi hỏi phải cài đặt bổ sung cho bạnObjectMapper ), tôi sử dụng những điều sau đây:

nhập khẩu:

import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;

mã:

// generates "yyyy-MM-dd" output
@JsonSerialize(using = ToStringSerializer.class)
// handles "yyyy-MM-dd" input just fine (note: "yyyy-M-d" format will not work)
@JsonDeserialize(using = LocalDateDeserializer.class)
private LocalDate localDate;

Và bây giờ tôi chỉ có thể sử dụng new ObjectMapper()để đọc và viết các đối tượng của mình mà không cần bất kỳ thiết lập đặc biệt nào.


3
Một điều tôi muốn thêm là vượt qua ngày "2018-12-07"thay vì "2018-12-7"người khác sẽ gặp lỗi.
Kid101

1
Đúng, nó hoạt động với yyyy-MM-ddđịnh dạng (2 chữ số tháng và ngày), không phải định dạng yyyy-M-d(1 chữ số tháng hoặc ngày).
Shadow Man

8

Chỉ là một bản cập nhật của câu trả lời Christopher.

Kể từ phiên bản 2.6.0

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.9.0</version>
</dependency>

Sử dụng JavaTimeModule thay vì JSR 310Module (không dùng nữa).

@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {  
    private final ObjectMapper MAPPER;

    public ObjectMapperContextResolver() {
        MAPPER = new ObjectMapper();
        MAPPER.registerModule(new JavaTimeModule());
        MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    }

    @Override
    public ObjectMapper getContext(Class<?> type) {
        return MAPPER;
    }  
}

Theo tài liệu , JavaTimeModule mới sử dụng các cài đặt tiêu chuẩn tương tự để mặc định cho việc tuần tự hóa mà không sử dụng Id múi giờ và thay vào đó chỉ sử dụng các độ lệch múi giờ tuân thủ ISO-8601.

Hành vi có thể được thay đổi bằng cách sử dụng serializationFeature.WRITE_DATE_WITH_ZONE_ID


Điều này đã giúp tôi. Trong trường hợp của tôi, tôi cần thêm MAPPER.registerModule(new JavaTimeModule());dòng. Nó cho phép tôi định dạng các đối tượng LocalDate thành định dạng "2020-02-20". Tôi không cần MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);đường dây, vì những gì tôi đang tìm kiếm
Cuga

5

Các chú thích sau đây làm việc tốt cho tôi.

Không cần phụ thuộc thêm.

    @JsonProperty("created_at")
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    @JsonSerialize(using = LocalDateTimeSerializer.class)
    private LocalDateTime createdAt;

5
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
private LocalDateTime createdDate;

4

https://stackoverflow.com/a/53251526/1282532 là cách đơn giản nhất để tuần tự hóa / giải trừ tài sản. Tôi có hai mối quan tâm về cách tiếp cận này - lên đến một số điểm vi phạm nguyên tắc DRY và tính khớp nối cao giữa pojo và mapper.

public class Trade {
    @JsonFormat(pattern = "yyyyMMdd")
    @JsonDeserialize(using = LocalDateDeserializer.class)
    @JsonSerialize(using = LocalDateSerializer.class)
    private LocalDate tradeDate;
    @JsonFormat(pattern = "yyyyMMdd")
    @JsonDeserialize(using = LocalDateDeserializer.class)
    @JsonSerialize(using = LocalDateSerializer.class)
    private LocalDate maturityDate;
    @JsonFormat(pattern = "yyyyMMdd")
    @JsonDeserialize(using = LocalDateDeserializer.class)
    @JsonSerialize(using = LocalDateSerializer.class)
    private LocalDate entryDate;
}

Trong trường hợp bạn có POJO với nhiều trường LocalDate, tốt hơn là định cấu hình trình ánh xạ thay vì POJO. Nó có thể đơn giản như https://stackoverflow.com/a/35062824/1282532 nếu bạn đang sử dụng các giá trị ISO-8601 ("2019-01-31")

Trong trường hợp bạn cần xử lý định dạng tùy chỉnh, mã sẽ như thế này:

ObjectMapper mapper = new ObjectMapper();
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyyMMdd")));
javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyyMMdd")));
mapper.registerModule(javaTimeModule);

Logic được viết chỉ một lần, nó có thể được sử dụng lại cho nhiều POJO


3

Đơn giản và ngắn nhất cho đến nay:

@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate localDate;

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime localDateTime;

không cần phụ thuộc với Spring boot> = 2.2+


1

Kể từ năm 2020 và Jackson 2.10.1, không cần bất kỳ mã đặc biệt nào, đó chỉ là vấn đề nói với Jackson những gì bạn muốn:

ObjectMapper objectMapper = new ObjectMapper();

// Register module that knows how to serialize java.time objects
// Provided by jackson-datatype-jsr310
objectMapper.registerModule(new JavaTimeModule());

// Ask Jackson to serialize dates as String (ISO-8601 by default)
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

Điều này đã được đề cập trong câu trả lời này , tôi đang thêm một bài kiểm tra đơn vị để xác minh chức năng:

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import lombok.Data;
import org.junit.jupiter.api.Test;

import java.time.LocalDate;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class LocalDateSerializationTest {

    @Data
    static class TestBean {
        // Accept default ISO-8601 format
        LocalDate birthDate;
        // Use custom format
        @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy")
        LocalDate birthDateWithCustomFormat;
    }

    @Test
    void serializeDeserializeTest() throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();

        // Register module that knows how to serialize java.time objects
        objectMapper.registerModule(new JavaTimeModule());

        // Ask Jackson to serialize dates as String (ISO-8601 by default)
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

        // The JSON string after serialization
        String json = "{\"birthDate\":\"2000-01-02\",\"birthDateWithCustomFormat\":\"03/02/2001\"}";

        // The object after deserialization
        TestBean object = new TestBean();
        object.setBirthDate(LocalDate.of(2000, 1, 2));
        object.setBirthDateWithCustomFormat(LocalDate.of(2001, 2, 3));

        // Assert serialization
        assertEquals(json, objectMapper.writeValueAsString(object));

        // Assert deserialization
        assertEquals(object, objectMapper.readValue(json, TestBean.class));
    }
}

TestBean sử dụng Lombok để tạo ra cái nồi cho đậu.


0

Trong lớp cấu hình, định nghĩa lớp LocalDateSerializerLocalDateDeserializer và đăng ký chúng vào ObjectMapper thông qua JavaTimeModule như bên dưới:

@Configuration
public class AppConfig
{
@Bean
    public ObjectMapper objectMapper()
    {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setSerializationInclusion(Include.NON_EMPTY);
        //other mapper configs
        // Customize de-serialization


        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer());
        javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer());
        mapper.registerModule(javaTimeModule);

        return mapper;
    }

    public class LocalDateSerializer extends JsonSerializer<LocalDate> {
        @Override
        public void serialize(LocalDate value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            gen.writeString(value.format(Constant.DATE_TIME_FORMATTER));
        }
    }

    public class LocalDateDeserializer extends JsonDeserializer<LocalDate> {

        @Override
        public LocalDate deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
            return LocalDate.parse(p.getValueAsString(), Constant.DATE_TIME_FORMATTER);
        }
    }
}

0

Nếu yêu cầu của bạn chứa một đối tượng như thế này:

{
    "year": 1900,
    "month": 1,
    "day": 20
}

Sau đó, bạn có thể sử dụng:

data class DateObject(
    val day: Int,
    val month: Int,
    val year: Int
)
class LocalDateConverter : StdConverter<DateObject, LocalDate>() {
    override fun convert(value: DateObject): LocalDate {
        return value.run { LocalDate.of(year, month, day) }
    }
}

Trên cánh đồng:

@JsonDeserialize(converter = LocalDateConverter::class)
val dateOfBirth: LocalDate

Mã này nằm trong Kotlin nhưng điều này cũng sẽ hoạt động với Java.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.