相关疑难解决方法(0)

使用JacksonMapper反序列化Java 8 LocalDateTime

我在SO中有关于序列化和反序列化java.time.LocalDateTime以及JSON属性的解答已经阅读了几个问题,但我似乎无法使其正常工作.

我已经设法配置我的Spring Boot应用程序以我希望的格式返回日期(YYY-MM-dd HH:mm)但是我在接受JSON中的这种格式的值时遇到了问题.

这些是我到目前为止所做的所有事情:

添加了maven依赖关系jsr310:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

jsr310在我的主要课程中指定:

@EntityScan(basePackageClasses = { App.class, Jsr310JpaConverters.class })
Run Code Online (Sandbox Code Playgroud)

禁用序列化作为时间戳application.properties:

spring.jackson.serialization.write_dates_as_timestamps=false
Run Code Online (Sandbox Code Playgroud)

这是我的日期时间实体映射:

@Column(name = "start_date")
@DateTimeFormat(iso = DateTimeFormat.ISO.TIME)
@JsonFormat(pattern = "YYYY-MM-dd HH:mm")
private LocalDateTime startDate;
Run Code Online (Sandbox Code Playgroud)

在我的数据库中,我将此日期存储为TIMESTAMP,格式如下:2016-12-01T23:00:00+00:00.

如果我通过我的控制器访问此实体,它将返回具有正确startDate格式的JSON.当我尝试发布它并反序列化时,使用YYYY-MM-dd HH:mm格式,我得到以下异常:

{
  "timestamp": "2016-10-30T14:22:25.285+0000",
  "status": 400,
  "error": "Bad Request",
  "exception": "org.springframework.http.converter.HttpMessageNotReadableException",
  "message": "Could not read document: Can not deserialize value of type java.time.LocalDateTime from String \"2017-01-01 20:00\": Text '2017-01-01 20:00' could not …
Run Code Online (Sandbox Code Playgroud)

java json jpa jackson spring-boot

27
推荐指数
5
解决办法
6万
查看次数

Jackson LocalDate/Time 反序列化

我配置了 jackson 以便它给我一个简单的字符串表示 ifjava.time.LocalDatejava.time.LocalDateTime。这可以在序列化过程中找到,例如当我在 REST api 上获取数据时。

不过反过来也行不通。当我尝试将数据发送到服务器并且 JSON 应该被解析为 java 对象时,会抛出此异常:

javax.ws.rs.client.ResponseProcessingException: com.fasterxml.jackson.databind.JsonMappingException: 无法构造 java.time.LocalDateTime 的实例: 没有从字符串值反序列化的字符串参数构造函数/工厂方法 ('2018-04- 19T14:10:30.903')

经过几个小时的研究,我设法让它工作,但仅限于我分别用@JsonDeserialize(using = LocalDateDeserializer.class)或注释的属性@JsonDeserialize(using = LocalDateTimeDeserializer.class)

在我看来,如果我可以在一个中心位置定义这些映射,那将是理想的。

ObjectMapper 配置:

@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {
    @Override
    public ObjectMapper getContext(Class<?> aClass) {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JavaTimeModule());
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

        return mapper;
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试向 JavaTimeModule 添加自定义反序列化器,但没有成功:

JavaTimeModule dateTimeModule = new JavaTimeModule();
dateTimeModule.addDeserializer(LocalDate.class, LocalDateDeserializer.INSTANCE);
dateTimeModule.addDeserializer(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE);

mapper.registerModule(dateTimeModule);
Run Code Online (Sandbox Code Playgroud)

长话短说:有没有办法全局定义映射,这样我就不需要在每个字段上添加这些注释。谢谢!

编辑:

好的:我用邮递员测试了它,没有注释,它按预期工作。但是,当我运行单元测试 (JerseyTest) 时,它会抛出上述异常。我将 …

java jersey jersey-test-framework jackson2

4
推荐指数
1
解决办法
3062
查看次数

Java 8 Time API的ObjectMapper配置

我们正在从Joda迁移到Java Time.目前我们DateTime在我们的实体中使用Joda.AFAIK DateTime相当于Java中的两种类型:OffsetDateTimeZonedDateTime.既然我们要将它们保存在数据库中,我们将使用OffsetDateTime(对此有何评论?).

现在的问题是如何ObjectMapper正确配置杰克逊.我在网上找到的所有例子都是关于Jackson已经提供de/serializer实现的本地类型(例如LocalDateTime,LocalDateTimeSerializerLocalDateTimeDeserializer).

我终于设法做了这样的事情:

public class OffsetDateTimeSerializer extends StdSerializer<OffsetDateTime> {

    private final DateTimeFormatter formatter; // We need custom format!

    public OffsetDateTimeSerializer(DateTimeFormatter formatter) {
        super(OffsetDateTime.class);
        this.formatter = formatter;
    }

    @Override
    public void serialize(OffsetDateTime value, JsonGenerator generator, SerializerProvider provider) throws IOException {
        generator.writeString(value.format(formatter));
    }

}
Run Code Online (Sandbox Code Playgroud)

public class OffsetDateTimeDeserializer extends StdDeserializer<OffsetDateTime> {

    private final DateTimeFormatter formatter; // We need custom format!

    public OffsetDateTimeDeserializer(DateTimeFormatter formatter) …
Run Code Online (Sandbox Code Playgroud)

java jackson jackson-modules java-time jackson-databind

4
推荐指数
2
解决办法
1560
查看次数