非Spring Boot环境下Spring Web MVC LocalDate反序列化报错如何解决?
问题根因
你自定义的LocalDateDeserializer反序列化逻辑存在重复读取JSON流的问题:
- 第一次调用
jp.readValueAs(String.class)打印日志后,JsonParser的读取指针已经从当前日期字符串值,移动到了下一个JSON token(下一个字段的字段名) - 第二次调用
jp.readValueAs(String.class)时,读取到的是字段名而非日期字符串,类型不匹配因此抛出MismatchedInputException
修复方案
修改LocalDateDeserializer的反序列化逻辑,仅读取一次JSON值存入变量后复用即可,修改后的代码如下:
public class LocalDateDeserializer extends StdDeserializer<LocalDate> { private static final long serialVersionUID = 1L; protected LocalDateDeserializer() { super(LocalDate.class); } @Override public LocalDate deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { // 仅读取一次值存入变量复用 String dateStr = jp.readValueAs(String.class); System.out.println(dateStr); LocalDate lDate; DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); try { lDate = LocalDate.parse(dateStr, dateTimeFormatter); } catch (Exception e) { System.out.println(e); lDate = LocalDate.now(); } return lDate; } }
修改完成后重新启动服务即可正常解析请求中的yyyy-MM-dd格式日期字符串为LocalDate类型。
额外校验点
如果修改后仍有问题,可检查POST请求体的dob字段格式是否符合要求,示例合法请求体如下:
{ "id": 1, "name": "张三", "surname": "张", "dob": "2024-01-01", "salary": 10000, "gender": "男" }
内容的提问来源于stack exchange,提问作者Fatih Aykut
相关产品推荐
相关产品推荐

