簡體   English   中英

使用Jackson將java.time.localdate序列化為json

[英]Serialize java.time.localdate into json using Jackson

我正在編寫一個Java 8 Spring MVC應用程序,它使用REST服務與傳統的Progress OpenEdge應用程序進行通信(我正在使用Spring的RestTemplate)。 我需要讀取和寫入Progress應用程序的數據包含一些日期。 在Java應用程序中,我使用java.time.LocalDate數據類型來表示這些字段,我使用Jackson將數據序列化/反序列化到Json中/從Json中反序列化。

我遇到的問題如下。 當我從Progress Application發送數據時,日期將作為'2015-01-02'發送,並按預期存儲在我的Java實體中作為LocalDate。 當數據發送到Web前端時,Json還包含相同格式的日期。 當我在Web前端更改信息並應用它時,它也會以“2015-01-02”的形式發送回Java應用程序,並再次存儲為LocalDate而不會出現問題。 但是,當我將數據發送到Progress應用程序時,我收到的Json不包含日期為'2015-01-02',而是包含三個字段(2015.0,1.0,2.0)的數組,並且Progress應用程序是無法將其分配回數據庫中的日期字段。

Offcourse我可以在Progress端編寫一個轉換來將數組轉換回日期,但是我想避免這種情況,因為我希望日期始終以ISO 8601格式發送。

根據我在Jackson上找到的信息,當啟用WRITE_DATES_AS_TIMESTAMPS時,java.time.LocalDate表示為一個數組,但我禁用了此功能(當日期發送到Web前端時,它不會被發送為陣列...)

這是一些相關的代碼:

CustomObjectMapper:

@Service
public class CustomObjectMapper extends ObjectMapper
{
  public CustomObjectMapper()
  {
    this.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,
                   false);
  }
}

我的servlet.xml中的配置

<mvc:annotation-driven>
  <mvc:message-converters>
    <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
      <property name="objectMapper" ref="customObjectMapper"/>
    </bean>
  </mvc:message-converters>
</mvc:annotation-driven>

<bean id="customObjectMapper" class="com.msoft.utility.CustomObjectMapper"/>

字段定義:

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

我正在使用帶有Spring 4.1.5和Jackson 2.5.1的Java 8。

任何提示我如何使這個工作或尋找解決方案將非常感激,因為我已經在這2天工作了...

謝謝

編輯:

一些額外的信息......

我在我的pom.xml中包含了Jackson JSR-310模塊。 這是我的pom文件的相關部分......

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.5.1</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-annotations</artifactId>
  <version>2.5.1</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.5.1</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-jsr310</artifactId>
  <version>2.5.1</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-test</artifactId>
  <version>4.1.5.RELEASE</version>
  <scope>test</scope>
  <type>jar</type>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>4.1.5.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-jpa</artifactId>
  <version>1.7.2.RELEASE</version>
</dependency>

此外,如果我理解正確,Spring會在檢測到時自動注冊該模塊。 請參閱Jackson2ObjectMapperFactoryBean上的信息

請注意,Jackson的JSR-310和Joda-Time支持模塊將在可用時自動注冊(當Java 8和Joda-Time本身可用時)。

所以我認為我不應該做任何其他事情來使這個工作正常,但顯然我仍然缺少一些東西......

這對我有用,我沒有使用Spring啟動。

@Configuration
@EnableWebMvc
public class SpringMvcConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        builder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
    }
}

我想你只需要注冊JSR-310(Java 8 Date / Time)模塊:

https://github.com/FasterXML/jackson-datatype-jsr310/

因為Jackson核心不能依賴任何Java 8特性(此時基線為2.5,是Java 6)。 對大多數數據類型庫的后續支持無論如何都將通過插件模塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM