【问题标题】:Jackson and java.sql.Time serialization / deserializationJackson 和 java.sql.Time 序列化/反序列化
【发布时间】:2016-12-11 03:48:17
【问题描述】:

Hibernate-managed 实体中考虑这个属性:

@JsonFormat(pattern = "HH:mm")
@Column(name = "start_time")
private java.sql.Time startTime;

我将JSON-object 作为@RequestBody 发布到 Spring Controller,Jackson 应该映射到实体的实例 (pojo)。

Jackson 显然无法将时间字符串反序列化为java.sql.Time,因为我遇到了这个异常:

.w.s.m.s.DefaultHandlerExceptionResolver : Failed to read HTTP message:
org.springframework.http.converter.HttpMessageNotReadableException:
Could not read document: Can not construct instance of java.sql.Time,
problem: null

如何指导Jackson 了解该怎么做?

【问题讨论】:

    标签: java json hibernate spring-mvc jackson


    【解决方案1】:

    您应该尝试使用java.sql.Timehh:mm:ss 时间格式,而不是hh:mm 格式。 这将是处理异常而不是覆盖JsonDeserializer 方法的更好方法。

    【讨论】:

      【解决方案2】:

      解决方案是推出自己的反序列化器:

      import java.io.IOException;
      import java.sql.Time;
      import com.fasterxml.jackson.core.JsonParser;
      import com.fasterxml.jackson.databind.DeserializationContext;
      import com.fasterxml.jackson.databind.JsonDeserializer;
      
      public class SqlTimeDeserializer extends JsonDeserializer<Time> {
      
          @Override
          public Time deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
              return Time.valueOf(jp.getValueAsString() + ":00");
          }
      }
      

      然后在实体中:

      @JsonFormat(pattern = "HH:mm")
      @JsonDeserialize(using = SqlTimeDeserializer.class)
      @Column(name = "start_time")
      private Time                startTime;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-19
        • 2019-08-10
        • 1970-01-01
        • 1970-01-01
        • 2013-01-01
        • 1970-01-01
        • 2012-08-08
        • 2019-04-03
        相关资源
        最近更新 更多