首先我的任务是通过接连访问企业微信的四五个接口来实现”企业Get到自己旗下的销售人员的企业微信中的所有客户信息” , 听起来还不算很难, 但是在开发过程中碰见了这几个问题
首先就是调用的方式 . 2020年了,肯定不会自己辛辛苦苦用http调用 , 所以我选择了Feign来调用 , 但是却总是报错:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.itmuch.contentcenter.feignclient.UserCenterFeignClient.findUserById
解决了半天,结果是因为因为少了个@EnableFeignClients注解 , 加上就没问题了
其次碰见的问题就是对象的反序列化 , 在反序列化DTO对象用来接收API返回的JSON时候 , 因为返回的JSON蛮复杂, 所以DTO中还是会有一些对象和数组, 我就直接使用了内部类 , 却报了这个错:
com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class com.cyj.demo02.testJson$People]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?)
原因呢就是因为使用了内部类 , 却没有使用static将其修饰为静态的 . 所以在编译的时候 , 他的class中会有一个对外部类的引用, 但是我们现在对其序列化的话, 又无法引用 ,所以会报错 . 但是用static修饰之后 , 由于类加载顺序中静态类是优先于普通类的(此时普通类也没有被编译,自然也无法被依赖和引用了~) 这样就能不需要外部类了,也就不报错了~
还碰见的一个问题就是给DO加了一个构造器 , 方便我把API那儿接收到的对象中的数据存在DO中 , 但是我竟然忘了 在写了一个有参构造器的同时,一定要把它的无参构造器显式的写出来!!! 结果导致这个DO的子类报错 , 子类找不到了父类的无参构造器,但是又没有调用我刚写的有参构造方法 , 导致了加载编译子类之前无法构造出他的父类, 真的好低级 , 还好周围没人哈哈
再就是因为没考虑周全API的返回结果的多样性, 程序的鲁棒太差 , 出现了NPE , 在加入了异常控制之后就ok啦! 这里分享一个处理异常的小口诀 :早抛出 晚处理. 就是(尽管throw 谁catch算谁输)因为早抛出有利于定位异常的位置和案发现场! 而晚catch呢 不是说越晚catch越好 , 吧所有异常都留到用户层面再catch 而是在适当的时候catch , 就算在用户层面再catch 也能保证用户得到了足够的信息啊~
而且今天还学习了一下实现定时任务的基本方式! 就是SpringTask!!! 在启动类上加上@EnableScheduling就能快乐的使用了 , 用法也很简单, 在需要定时运行的方法上加上@Scheduled(cron = “0 0 12 * * ?”) 参数是corn表达式哦 , 这就就可以实现简单的定时运行了 这个表达式的意思是每天的12点0分0秒运行一次 .
暂时应该在这两天的开发中就碰见了这些问题, 也暴露了我很多的问题
1. 知识盲区很大 2. 已学过的知识掌握的不够牢靠 3.不够细心
但是索性都愉快(痛苦)的解决了呢 , 所以还是好事~
One Comment
再看那时候写的东西,就俩字 ,tm青涩 🙄