Spring boot + Jackson + LocalDateTime:日期未正确解析

时间:2017-10-25 16:22:55

标签: java spring-boot java-8 jackson

我的实体类中有一个LocalDateTime属性,但是当它被序列化时,我看不到预期的格式。

这是班级:

public class MyEntity {

     private Integer id;
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'")
     private LocalDateTime changeDate;

     // getters and setters

}

杰克逊正在格式化它:

{
    "id": 56, 
    "changeDate": {
        "hour":14, "minute":19, 
        "nano":797000000, 
        "second":7, 
        "dayOfMonth":24, 
        "dayOfWeek":"TUESDAY", 
        "dayOfYear":297, "month":"OCTOBER", 
        "monthValue":10, 
        "year":2017,
        "chronology": { 
             "id":"ISO",
             "calendarType":"iso8601"
        }
    }
}

请注意,我将以下依赖项添加到我的pom:

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

我没有包含该版本,因为spring boot负责这一点。 顺便说一下,我正在使用春季启动1.5.2.RELEASE。

我还在application.properties中包含了以下属性:

spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false

任何想法为什么日期没有像那样格式化而不是使用我提供的模式?

2 个答案:

答案 0 :(得分:3)

刚检查了我的项目。我的解串器:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.ObjectCodec;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;

import java.io.IOException;
import java.time.LocalDateTime;

import static java.time.format.DateTimeFormatter.ISO_LOCAL_DATE_TIME;

public class JsonDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {

private static final String NULL_VALUE = "null";

@Override
public LocalDateTime deserialize(JsonParser jp, DeserializationContext ctxt)
        throws IOException {
    ObjectCodec oc = jp.getCodec();
    JsonNode node = oc.readTree(jp);
    String dateString = node.textValue();

    LocalDateTime dateTime = null;
    if (!NULL_VALUE.equals(dateString)) {
        dateTime = LocalDateTime.parse(dateString, ISO_LOCAL_DATE_TIME);
    }
    return dateTime;
}
}

我的序列化器:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;
import java.time.LocalDateTime;

import static java.time.format.DateTimeFormatter.ISO_LOCAL_DATE_TIME;

public class JsonLocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
@Override
public void serialize(LocalDateTime dateTime, JsonGenerator generator, SerializerProvider provider)
        throws IOException {

    String dateTimeString = dateTime.format(ISO_LOCAL_DATE_TIME);
    generator.writeString(dateTimeString);
}
}

您需要设置自己的格式化程序。

在我的RestConfig中,我有:

@Configuration
@ComponentScan(value = {"ru.outofrange.controller"})
public class RestConfig extends RepositoryRestConfigurerAdapter {

@Override
public void configureJacksonObjectMapper(ObjectMapper objectMapper) {
    objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
    objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);

    registerSerializerDeserializer(objectMapper);
}

private void registerSerializerDeserializer(ObjectMapper objectMapper) {
    SimpleModule module = new SimpleModule();

    module.addSerializer(LocalDateTime.class, new JsonLocalDateTimeSerializer());
    module.addDeserializer(LocalDateTime.class, new JsonDateTimeDeserializer());

    objectMapper.registerModule(module);
}

}

答案 1 :(得分:2)

我尝试重现您的示例并且效果很好。

&#xA;&#xA;

MyEntity

&#xA;&#xA; < pre> public class MyEntity {&#xA; private Integer id;&#xA; @JsonFormat(shape = JsonFormat.Shape.STRING,pattern =“yyyy-MM-dd'T'HH:mm:ss'Z'”)&#xA; private LocalDateTime time;&#xA;&#xA; public MyEntity(Integer id,LocalDateTime time){&#xA; this.id = id;&#xA; this.time = time;&#xA; }&#XA;&#XA; public Integer getId(){&#xA; return id;&#xA; }&#XA;&#XA; public void setId(Integer id){&#xA; this.id = id;&#xA; }&#XA;&#XA; public LocalDateTime getTime(){&#xA;返回时间;&#xA; }&#XA;&#XA; public void setTime(LocalDateTime time){&#xA; this.time = time;&#xA; }&#XA;}&#XA; &#XA;&#XA;

<代码> LocalDateTimeApplication

&#XA;&#XA; < pre> @ SpringBootApplication&#xA; public class LocalDateTimeApplication {&#xA;&#xA; public static void main(String [] args){&#xA; SpringApplication.run(LocalDateTimeApplication.class,args);&#xA; }&#XA;}&#XA; &#XA;&#XA;

<代码> SomeController

&#XA;&#XA; < pre> @ RestController&#xA; @RequestMapping(“/ SomeController”)&#xA; public class SomeController {&#xA;&#xA; @RequestMapping(method = RequestMethod.GET)&#xA; public ResponseEntity&lt; Object&gt; getMyEntity(){&#xA; MyEntity entity = new MyEntity(1,LocalDateTime.now());&#xA;返回新的ResponseEntity&lt; Object&gt;(entity,HttpStatus.OK);&#xA; }&#XA;}&#XA; &#XA;&#XA;

<代码>的pom.xml

&#XA;&#XA ;
 &lt;?xml version =“1.0”encoding =“UTF-8”?&gt;&#xA;&lt; project xmlns =“http://maven.apache.org/POM/4.0。 0“xmlns:xsi =”http://www.w3.org/2001/XMLSchema-instance“&#xA; xsi:schemaLocation =“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 &LT; modelVersion&GT; 4.0.0&LT; / modelVersion&GT;&#XA;&#XA; &LT;&的groupId GT; com.so.example&LT; /&的groupId GT;&#XA; &LT; artifactId的&GT; localDateTime&LT; / artifactId的&GT;&#XA; &LT;版本&GT; 0.0.1-快照LT; /版本&GT;&#XA; &LT;包装和GT;罐子&LT; /包装&GT;&#XA;&#XA; &LT;名称&gt;&localDateTime LT; /名称&gt;&#XA; &lt; description&gt; Spring Boot的演示项目&lt; / description&gt;&#xA;&#xA; &LT亲本GT;&#XA; &LT;&的groupId GT; org.springframework.boot&LT; /&的groupId GT;&#XA; &LT; artifactId的&GT;弹簧引导起动 - 亲本LT; / artifactId的&GT;&#XA; &LT;版本&GT; 1.5.8.RELEASE&LT; /版本&GT;&#XA; &LT; relativePath /&GT;&#XA; &LT; /亲本GT;&#XA; &LT;性状&gt;&#XA; &LT; project.build.sourceEncoding&GT; UTF-8&LT; /project.build.sourceEncoding>&#XA; &LT; project.reporting.outputEncoding&GT; UTF-8&LT; /project.reporting.outputEncoding>&#XA; &LT; java.version&GT; 1.8&LT; /java.version>&#XA; &LT; /性状&gt;&#XA;&#XA; &LT;依赖性&GT;&#XA; &LT;依赖性&GT;&#XA; &LT;&的groupId GT; org.springframework.boot&LT; /&的groupId GT;&#XA; &LT; artifactId的&GT;弹簧引导起动&LT; / artifactId的&GT;&#XA; &LT; /依赖性&GT;&#XA; &LT;依赖性&GT;&#XA; &LT;&的groupId GT; org.springframework.boot&LT; /&的groupId GT;&#XA; &LT; artifactId的&GT;弹簧引导起动试验&LT; / artifactId的&GT;&#XA; &LT;范围&GT;试验&LT; /范围&GT;&#XA; &LT; /依赖性&GT;&#XA; &LT;依赖性&GT;&#XA; &LT;&的groupId GT; com.fasterxml.jackson.datatype&LT; /&的groupId GT;&#XA; &LT; artifactId的&GT;杰克逊 - 数据类型-jsr310&LT; / artifactId的&GT;&#XA; &LT;版本&GT; 2.9.2&LT; /版本&GT;&#XA; &LT; /依赖性&GT;&#XA; &LT;依赖性&GT;&#XA; &LT;&的groupId GT; org.springframework.boot&LT; /&的groupId GT;&#XA; &LT; artifactId的&GT;弹簧引导起动的Web&LT; / artifactId的&GT;&#XA; &LT;版本&GT; RELEASE&LT; /版本&GT;&#XA; &LT; /依赖性&GT;&#XA; &LT; /依赖性&GT;&#XA;&#XA; &LT;建立&GT;&#XA; &LT;插件&GT;&#XA; &LT;插件&GT;&#XA; &LT;&的groupId GT; org.springframework.boot&LT; /&的groupId GT;&#XA; &LT; artifactId的&GT;弹簧引导行家-插件&LT; / artifactId的&GT;&#XA; &LT; /插件&GT;&#XA; &LT; /插件&GT;&#XA; &LT; /构建&GT;&#XA;&LT; /项目&GT;&#XA;  
&#XA;&#XA;
&#XA;&#XA;

<一个href =“https://i.stack.imgur.com/VdzOS.png”rel =“nofollow noreferrer”>

&#XA;