Jackson 只提供了针对 java.sql.Time序列化工具,没有提供反序列化,从而导致在反序列化时报错:
aused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.sql.Time` (no Creators, like default construct, exist): no String-argument constructor/factory method to deserialize from String value ('17:21:27')
解决方法:
1、自定义反序列化处理java.sql.Time
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
import java.sql.Time;
/**
* 处理sql.time无法反序列化问题
*
* @author Yang douya
* @date 2024/3/7 10:34
*/
public class SqlTimeDeserializer2Jackson extends JsonDeserializer<Time> {
@Override
public Time deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
return Time.valueOf(jsonParser.getValueAsString());
}
}
2、实体中直接使用自定义反序列化
@JSONField(format = "HH:mm:ss")
@JsonFormat(pattern = "HH:mm:ss", timezone = "GMT+8")
@JsonSerialize(using = SqlTimeSerializer.class)
@JsonDeserialize(using = SqlTimeDeserializer2Jackson.class)
private Time startTime;
@JSONField(format = "HH:mm:ss")
@JsonFormat(pattern = "HH:mm:ss", timezone = "GMT+8")
@JsonSerialize(using = SqlTimeSerializer.class)
@JsonDeserialize(using = SqlTimeDeserializer2Jackson.class)
private Time endTime;