范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

SpringBoot项目传参校验最佳实践

  场景还原
  简单业务场景模拟:
  假如你现在在做一个成绩录入系统,你愉快地用 Spring Boot框架 写了一个后台接口,用于接收前台浏览器传过来的 Student  对象,并插入后台数据库。
  我们将传入的  Student  对象定义为: public class Student {     private String name;    // 姓名     private Integer score;  // 考试分数(满分100分)     private String mobile;  // 电话号码(11位) }
  然后写一个 Post请求 的后台接口,来接收网页端传过来的 Student  对象: @RestController public class TestController {      @Autowired     private StudentService studentService;      @PostMapping("/add")     public String addStudent( @RequestBody Student student ) {         studentService.addStudent( student ); // 将student对象存入数据库         return "SUCCESS";     } }
  此时我想你一定看出来了上面这段 代码的漏洞 ,因为我们并没有对传入的 Student  对象做任何数据校验 ,比如:
  Student  对象里三个字段的某一个忘传了,为 null  怎么办?Student  的 score  分数,假如写错了,写成 101  分怎么办?Student  的 mobile  11位手机号码,假如填错了,多写了一位怎么办?...等等
  这些数据虽然在前端页面一般会做校验,但我们作为一个 严谨且良心 的后端开发工程师,我们肯定要对传入的每一项数据做严格的校验 ,所以我们应该怎么写? @PostMapping("/add") public String addStudent( @RequestBody Student student ) {      if( student == null )         return "传入的Student对象为null,请传值";     if( student.getName()==null || "".equals(student.getName()) )         return "传入的学生姓名为空,请传值";     if( student.getScore()==null )         return "传入的学生成绩为null,请传值";     if( (student.getScore()<0) || (student.getScore()>100) )         return "传入的学生成绩有误,分数应该在0~100之间";     if( student.getMobile()==null || "".equals(student.getMobile()) )         return "传入的学生电话号码为空,请传值";     if( student.getMobile().length()!=11 )         return "传入的学生电话号码长度有误,应为11位";      studentService.addStudent( student ); // 将student对象存入MySQL数据库     return "SUCCESS"; }
  写是写完了,就是感觉 手有点酸 ,并且心有点累 ,这个 Student  对象倒还好,毕竟内部仅3个字段,假如一个复杂的对象有30个字段怎么办?简直不敢想象!
  神注解加持!
  其实Spring框架很早版本开始,就通过 注解的方式 ,来方便地为我们提供了各项交互数据的校验 工作,比如上面的例子,我们只需要在传入的 Student  实体类的字段中加入对应注解即可方便的解决问题: public class Student {      @NotNull(message = "传入的姓名为null,请传值")     @NotEmpty(message = "传入的姓名为空字符串,请传值")     private String name;    // 姓名      @NotNull(message = "传入的分数为null,请传值")     @Min(value = 0,message = "传入的学生成绩有误,分数应该在0~100之间")     @Max(value = 100,message = "传入的学生成绩有误,分数应该在0~100之间")     private Integer score;  // 分数      @NotNull(message = "传入的电话为null,请传值")     @NotEmpty(message = "传入的电话为空字符串,请传值")     @Length(min = 11, max = 11, message = "传入的电话号码长度有误,必须为11位")     private String mobile;  // 电话号码 }
  当然,于此同时,我们还需要在对象入口处,加上注解  @Valid  来开启对传入 Student  对象的验证工作: @PostMapping("/add") public String addStudent( @RequestBody  @Valid Student student ) {      // 棒棒哒!原先各种繁杂的参数校验工作统统都省了!一行代码不用写      studentService.addStudent( student ); // 将student对象存入MySQL数据库     return "SUCCESS"; }
  这时候,如果某个字段传入错误,比如我传数据的时候,将学生的成绩误传为  101  分,则接口返回结果便会提示出错误详情:
  当然,关于这个事情的原理,既然用到了注解,无非用的也就是Java里的各种反射等知识来实现的,感兴趣的小伙伴可以借此机会研究一下!
  数据异常统一拦截
  上面利用注解的方式做统一数据校验 感觉十分美好 ,但唯一美中不足的就是返回的结果太过繁杂 ,不一定使我们需要的格式,我们需要做统一处理 ,比如:我只想将具体参数校验的错误提示信息给抠出来 返回给前端即可。
  为此,我们为项目配置 全局统一异常拦截器 来格式化所有数据校验的返回结果。 @ControllerAdvice @ResponseBody public class GlobalExceptionInterceptor {    @ExceptionHandler(value = Exception.class)   public String exceptionHandler(HttpServletRequest request, Exception e) {     String failMsg = null;     if (e instanceof MethodArgumentNotValidException) {       // 拿到参数校验具体异常信息提示       failMsg = ((MethodArgumentNotValidException) e).getBindingResult().getFieldError().getDefaultMessage();     }     return failMsg; // 直接吐回给前端   } }
  如上面代码所示,我们 全局统一拦截了 参数校验异常 MethodArgumentNotValidException  ,并仅仅只拿到对应异常的详细 Message  信息吐给前端,此时返回给前端的数据就清楚得多:
  可以的,非常优雅!
  每天进步一点点!Peace!

甘肃省酒泉市双禧面粉有限责任公司在创新中寻求高质量发展回顾工商联执委企业风采酒泉市双禧面粉有限责任公司在创新中寻求高质量发展肃州统战202204292347发表于甘肃酒泉市双禧面粉有限责任公司成立于2002年8月,是肃州区工商联的老牌外国人最喜欢去的我国的这些美景,你都去过吗?都去过才是真厉害祖国山河,锦绣中华!张家界山美水美人更美,张家界的景色仿佛是仙境,奇山怪石,碧山绿水,应有尽有。黄果树瀑布黄果树瀑布景色壮美,风景秀丽,令人心驰神往!九寨沟都说神奇的九寨沟是人间的成都3000亩超大公园走断腿都看不完的美景,地铁直达小伙伴们,大家好,我是菜菜,咱们继续聊旅游吧。故事里的小黄花,周杰伦这充满诗情画意的歌词在浪漫的成都有了实景打卡点,地点就在青龙湖二期,导航二期儿童乐园就可以到。最近也因为成片小黄这些秋日里细碎的美景,就是生活最好的解药这个世界充满了喧嚣和纷乱,我们每个人的天空也常有阴霾飘过,但是那些秋日里的点滴美景,就是生活里细碎的喜悦和温馨,让我们享受到了生命的快乐与美好,给我们心底注入了活力和希望。秋天的大卡塔尔足协宣布击败韩国,将承办2023年亚洲杯北京时间10月17日,卡塔尔足协官方宣布,今年的世界杯东道主卡塔尔,在和韩国的竞争中胜出,获得2023年亚洲杯的举办权。这也是卡塔尔继1988年2011年后,第3次承办亚洲杯赛事。进不了季后赛!CBA最大黑马惨遭完爆,广东宏远正式成最大赢家202223赛季CBA常规赛第三轮的比赛继续进行,一场焦点大战在实力不俗的上海男篮与大黑马浙江男篮之间展开激烈的较量。经过四节激战,实力更胜一筹的浙江队凭借更强的团队发挥,以121上午8点,朱婷亮相宣布重要决定,中国女排巅峰将至,蔡斌懂了北京时间10月17日,中国女排在结束的女排世锦赛中取得了第六名的成绩,球队在四分之一决赛输给了意大利女排,而本届比赛意大利女排取得了第三名的成绩,塞尔维亚成功实现了卫冕夺冠,巴西女乒乓球亚洲杯中国队随行人员名单变更10月17日,中国乒乓球队亚洲杯随行人员名单产生了变化,如下男队教练王皓女队教练马琳队医文建山助理教练伊习宁原来的名单是领队秦志戬男队教练刘恒刘志强女队教练马琳邱贻可队医文建山助理10月19日两战深度解析勇士要打花湖人,没了罗威绿军要输76人本周三NBA202223赛季就将正式开始,卫冕冠军金州勇士将在主场大通中心迎战洛杉矶湖人,而在比赛中场休息时勇士队将领取上赛季总冠军戒指,同时也会在大通中心升起队史第七面总冠军旗帜CBA三消息辽宁外援伤势反复,郭艾伦篮板第四,常林12分14篮板大家好呀,我是北柠,各位小伙伴们要养成先赞后看的习惯哦!这个赛季常规赛第一阶段比赛已经正式开打,目前辽宁队就只有一名小外援弗格,球迷们都非常期待球队的大外援莫兰德尽快回归,然而至今普尔与维金斯先后被续约,格林被正式摆上货架?早些时间勇士队先后以4年1。4亿美元和4年1。09亿美元敲定了两笔合同,续约年轻新星乔丹普尔和稳定锋线安德鲁威金斯。勇士队与普尔维金斯达成续约合同,现在唯一觉得自己利益受损的应该就
天涯社区再被强制执行20万累计被执行超1。39亿元中国执行信息公开网17日消息,天涯社区网络科技股份有限公司近日新增一则被执行人信息,执行标的20。01万,案号为(2022)琼0106执7172号。天涯社区官网显示,天涯社区网络科米歇尔基根现身游艇,在日落中穿着透明的裙子,纤细长腿让人心动据每日星报11月15日消息,黑发美女米歇尔基根(MichelleKeegan)在迪拜度假时,在Instagram上向粉丝们展示了自己苗条的身材,这让她的风采更上一层。前加冕街(CoNASA分享从其时速5500英里的飞船在58000英里处拍摄的地球图像美国国家航空航天局(NASA)的猎户座飞船为阿特米斯1号任务传回了第一批地球图像,就在不久前。猎户座今天清晨在太空发射系统(SLS)火箭上发射,经过几个月的努力,美国宇航局数次停摆世界杯巡礼之波兰铁骑力求小组突围,莱万梅西巅峰对决引人期待波兰队虽然不是世界顶级强队,但也是所有强队眼中一块难啃的骨头。目前波兰国家队的纸面实力定位是欧洲二流,不过,在最近几届世界大赛中,波兰国家队的表现往往不尽如人意,球队头号球星莱万也谢谢你医生完美收官,大结局收视创新高,期待第二部谢谢你医生是杨幂和白宇领衔主演的医疗群像剧,该剧根据笙离的小说ICU48小时改编,一共40集!于2022年11月4日在央视八套播出,每天三集连播,2022年11月17日大结局!谢谢一加11首发的黑科技平台是什么?手游也能上光追了,你期待吗?近日,备受瞩目的高通第二代骁龙8平台正式发布,除了进一步在CPU性能和外围功能方面的升级以外,第二代骁龙8平台还在GPU端首次引入了硬件光线追踪的支持。值得一提的是,即将发布的一加便秘别只知道通便,找到便秘的原因,从根源解决才是关键如今,生活节奏很快,饮食种类也多样化。许多上班族不受控制的饮食习惯往往会导致肠道负担加重和便秘。有些人总是使用一些泻药或吃一些水果来缓解,虽然它们可以暂时排泄粪便,但便秘的问题并没既然天体都拥有温度,星际空间又怎么会是绝对零度的?作者黄姤帕克太阳探测器在2021年4月穿过了太阳的日冕层,探测到这里的温度高达93万,表面温度大约有6000。太阳东升的时候我们可以感受到温度是在上升的,当太阳西落的时候我们可以感陕西省人民政府发布一批最新人事任免通知11月16日,陕西省政府网站发布一批任免职通知,具体内容如下陕西环保产业集团有限公司陕西省政府2022年11月7日决定,免去熊良虎的陕西环保产业集团有限公司董事长职务,退休。陕西省魔兽世界等暴雪游戏即将关服,80后的那些老网瘾少年再无情怀新闻链接当地时间2022年11月16日,暴雪娱乐发布声明,由于同网易的现有授权协议将在2023年1月23日到期,将暂停在中国大陆的大部分暴雪游戏服务,包括魔兽世界炉石传说守望先锋星多吃蔬菜,头发长得好蔬菜对我们有多重要,相信不用我说你也知道。其实蔬菜对头发也有很大的促进作用,多吃这些蔬菜,头发会长得更好。1。菠菜预防脱发,使头发柔亮有光泽菠菜中含有丰富的Omega3脂肪酸钾镁钙