我有這個類:
public class MyLocalApplicationClass {
private String name
private LocalDateTime creationDate;
private String createdBy;
}
在我從休息服務收到的回應中,我得到了這個物件(作為 json):
public class MyRemoteApplicationClass {
private String name
private Date creationDate;
private String createdBy;
}
因此,當我發送請求時,我會像這樣從 MyRemoteApplicationClass 獲取 creationDate 的值 (json):
{
“name”:”anything”,
"creation_date": 1666190973000,
"created_by": “anyone”
}
所以我想知道是否可以將其作為 LocalDateTime 接收,或者我應該將其作為 Date 接收,然后將其轉換為 LocalDateTime(認為這是我的最佳選擇)?
因為我試圖將它作為 LocalDateTime 接收,但它會拋出此錯誤:
"raw timestamp (1656015404000) not allowed for `java.time.LocalDateTime`: need additional information such as an offset or time-zone (see class Javadocs)"
我也嘗試LocalDate僅接收它,但它拋出此錯誤(我已經添加了 jsr310 的依賴項,還添加了帶有此注釋的序列化器和反序列化器,@JsonSerialize(using = LocalDateSerializer.class) @JsonDeserialize(using = LocalDateDeserializer.class)所以我認為真正的問題是警告)和警告:
Java 8 date/time type `java.time.DateTimeException` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: com.fasterxml.jackson.databind.JsonMappingException["cause"])
WARN -- com.fasterxml.jackson.databind.JsonMappingException: Invalid value for EpochDay (valid values -365243219162 - 365241780471): 1656015404000
uj5u.com熱心網友回復:
有幾種可能的解決方案:
- 您可以在您的檔案中宣告全引數建構式
MyLocalApplicationClass,并用@JsonProperty. 和承包商引數creationDate應作為接收long。它將從紀元毫秒到LocalDateTime手動決議。
這可能看起來像:
public class MyLocalApplicationClass {
private String name;
private LocalDateTime creationDate;
private String createdBy;
public MyLocalApplicationClass(@JsonProperty("name") String name,
@JsonProperty("creationDate") long creationDate,
@JsonProperty("createdBy") String createdBy) {
this.name = name;
this.createdBy = createdBy;
this.creationDate = Instant
.ofEpochMilli(creationDate)
.atZone(ZoneOffset.UTC)
.toLocalDateTime();
}
}
- 另一種選擇是將
creationDate屬性型別更改為Instant. 為了使作業正常,我們需要ObjectMapper通過注冊JavaTimeModule模塊和指示映射器時間戳的精度來進行配置,即將反序列化屬性設定DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS為 false。為此,我們需要將Jackson2ObjectMapperBuilderandObjectMapper作為 Beans 放入 Spring 的背景關系中。
@Configuration
public class JsonConfig {
@Bean
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
return new Jackson2ObjectMapperBuilder();
}
@Bean
public ObjectMapper objectMapper() {
return jackson2ObjectMapperBuilder()
.build()
.registerModule(new JavaTimeModule())
.configure(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS, false);
}
}
這將允許MyLocalApplicationClass在不使用資料系結注釋的情況下進行反序列化(但前提是creationDate將被宣告為 of type Instant):
public class MyLocalApplicationClass {
private String name;
private Instant creationDate;
private String createdBy;
// getter, setters, etc.
}
- 最后,我們可以實作一個自定義,并通過使用注釋對欄位進行注釋
Deserializer來應用它。creationDate@JsonDeserialize
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/534496.html
標籤:爪哇JSON弹簧靴杰克逊
