记一次在springmvc接受json数据时的一个坑

     作为还不会手撕框架的小码农,遇到问题只能依靠自己的经验,百度,以及以前的项目代码对比来解决问题,很不幸今天碰到的问题是本来对的代码该坏了,自己不知道,但是结局是好的,I find it;

     前后端分离,数据交互使用json数据,先说下原本对的代码:

  @RequestMapping(value = "/workexperience" , method = RequestMethod.POST)
    JsonResult workExperience(@CurrentUserId Long userId,@RequestBody RequestObject param){
        UserWorkExperience experience = param.toJavaBean(UserWorkExperience.class);
        experience.setUserId(userId);
        workExperienceService.saveUserWorkExperience(experience, param.getShort("ishidden"));
        return JsonResult.SUCCESS();
    }

    实际上也很容易理解,json数据就要用@RequestBody接受嘛.没毛病(废话,这个是对的),此处RequestObject本质上就是一个map,

    然后起因是因为项目中一个同事,他说我这段代码他坚决不会这样使用.因为Springmvc有自动封装的功能.为什么要先获取一个map,然后又反射成一个对象.明明可以直接映射到对象中.这是多此一举,

    由于以前写代码的时候带我的是一个技术非常好的人也非常好的人,我一直模仿他的代码,但是没有质疑过,所以我没想过有什么问题,同事说出之后,我考虑了一下,我认为他是对的,于是我做了一个错误的决定,我要消除这种冗余,于是代码成了这样:

 @RequestMapping(value = "/workexperience" , method = RequestMethod.POST)
    JsonResult workExperience(@CurrentUserId Long userId,UserWorkExperience experience,Short ishidden){
        experience.setUserId(userId);
        workExperienceService.saveUserWorkExperience(experience, ishidden);
        return JsonResult.SUCCESS();
    }

     对于我来说,controller的即使减少一行代码也是值得的,如果你一眼看出问题所在,请不要嘲笑我,因为我现在只能模仿还不懂框架的奥妙

   前端找我联调了,我一向都是有问题不管是不是我的我都会尽力找.最终,前端自己发现她的问题,而我则发现我自己的代码也有问题;很奇妙,前端发现她的代码有一个大bug.而我则发现我也有;主要在于,jsp写多了.前后端分离就发现一些基础竟然不知道!!!

   总结下自己的发现吧:

1.@ReqeustBody应该只有一个.不能用多个,百度上有一篇文章是错误的.url不粘,但是代码片段看一下

  很明显注解的首字母大写.写文章的人应纯手敲.奈何是自己没有试验,就发网上,误导了我,上述代码假设没有错误,那么userName中应该是json字符串,也就是说username和pwd形成的这个字符串应该映射到userName中,那么pwd倒是是什么呢?所以必然报错
何况,,,注解首字母小写..................

2.刚好是实体的字段.直接使用实体映射比如这里

 @RequestMapping(value = "/projectexperience" , method = RequestMethod.POST)
    JsonResult projectExperience(@CurrentUserId Long userId,@RequestBody UserExperienceProject project) {
        projectService.saveProjectExperience(userId,project);
        return JsonResult.SUCCESS();
    }

3.如果json中字段较多.并且没有对应成实体.可以考虑使用一个map接受,然后利用反射,或者使用BeanUtils生成需要使用的实体对象,再进行相关操作;

总之,能够前后端分离真好,有充分的时间看看设计模式,一些框架源码之类.讨厌js!!!

猜你喜欢

转载自blog.csdn.net/alan_waker/article/details/82115727