com.fasterxml.jackson.databind.JsonMappingException: Unsupported field: HourOfDay

       最近碰到一个异常,对就是json转换的异常!

com.fasterxml.jackson.databind.JsonMappingException: Unsupported field: HourOfDay 这个是主要的报错信息,其他的栈溢出一大堆就不贴了。回头再看,这个异常就感觉比较low了,初见时真的是毫无头绪,感觉这种bug就是奇葩的bug,瞅了一圈,不知道在代码哪一行报的错,栈里面的异常全是引用的jar包,贼烦人!

问题找不到原因,不用想,一定是有些很平凡的东西被你忽略了,特别是这种json转换或者是遍历删除什么之类的报错。

别想了,休息一下,第二天再看,原来。。。。这报错这么长啊,还是没看找到问题,哈哈哈!

不多扯了,说下我这个low的bug是怎么来的。

首先,我是要查询一个MySQL数据表中的时间字段,接收使用的是LocalDate,LocalDate是目前使用比较普遍的一个日期类,如果大家经常使用时间的包装类的话,就会发现Date的许多方法都是过时的。LocalDate中对于年月日进行了很好的封装,不管是获取还是计算都变得十分容易。下面举个栗子!

public static void main(String[] args) throws Exception {

        LocalDate date = LocalDate.now();
        int year = date.getYear();
        int month = date.getMonthValue();

//       举个栗子
        // 月份添加
        LocalDate endDate = date.plusMonths(58);
        //月份相减
        long l = ChronoUnit.MONTHS.between(date, endDate);


        System.out.println("Year:" + year + "  Month:" + month);
        System.out.println("年份:" + endDate.getYear() + " 月份差:" + l);

    }

大家可以看到,年月日的获取,相加减,都是可以轻易算出来的哦,如果想要了解的更深入,大家可以去看下LocalDate的源码哈。

回到刚刚的问题,使用LocalDate接收时间格式的字段自然没有任何问题,如果大家试一下的话也会发下时间被正确返回。

然而,后面还有一个操作,需要返回个前端!

前后端交互,Spring已经封装的比较完善了,时间格式的返回,自然是可以定义的,想必大家都知道,嘿嘿嘿!

只要在字段上添加注解     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")  自然可以返回自己想要的格式。

扫描二维码关注公众号,回复: 13036055 查看本文章

然后,报错就出来了,json转换失败,Unsupported field: HourOfDay。。。。

这个是为什么呢?

稍稍看下LocalDate的构造,就会发现,这个问题好low啊!

原来!

原来。。。

LocalDate只有年月日!

根本没有时分秒!

当然转换不了小时啊!自然会报Unsupported field: HourOfDay!

所以,要解决这个问题,直接使用Date接收或者返回前端年月日就行了,改下注解@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8"),就OK了。

当然这个要看业务的要求。

提醒自己一声:越是奇葩的问题,越要冷静!一步步,一点点看,千万不要跳流程~

当然,灵光一现,很重要,哈哈。

好啦,闲聊到这里,共同学习,共同进步~

 

     

猜你喜欢

转载自blog.csdn.net/zsah2011/article/details/111030706