Jackson和java.sql.Time序列化/反序列化

ygl*_*odt 4 java json hibernate spring-mvc jackson

在一个Hibernate托管实体中考虑这个属性:

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

我张贴JSON-object为@RequestBody到一个Spring控制器Jackson应该映射到实体(POJO)的一个实例.

Jackson显然没有设法将时间字符串反序列化为a 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
Run Code Online (Sandbox Code Playgroud)

我该如何指导Jackson理解该怎么做?

ygl*_*odt 5

解决方案是滚动自己的反序列化器:

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在实体中:

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


Mau*_*iya 5

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