为什么80%的码农都做不了架构师?>>>   

本文主要研究下webflux如何进行参数校验

使用javax.validation

domain

import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;public class User {@Min(1)private long id;@NotEmptyprivate String name;@Min(20)private int age;//...
}

通过onErrorResume处理异常

  • form表单提交
    /*** curl -i -X POST -d 'id=-1&name=a&age=10' http://localhost:8080/user/validate-mono** curl -i -X POST -d 'id=2&name=a&age=10' http://localhost:8080/user/validate-mono** curl -i -X POST -d 'id=2&name=a&age=30' http://localhost:8080/user/validate-mono* @param user* @return*/@PostMapping("/validate-mono")public Mono<String> formValidate(@Validated Mono<User> user) {return user.map(u -> "Hello " + u.getName()).onErrorResume(WebExchangeBindException.class, e -> Mono.just(bindingResult2String(e.getBindingResult())));}
  • post json
    /*** curl -i -H "Content-Type: application/json" -X POST -d '{"id":-11,"name":"a"}' http://localhost:8080/user/validate-mono-json-body** curl -i -H "Content-Type: application/json" -X POST -d '{"id":12,"name":"a","age":30}' http://localhost:8080/user/validate-mono-json-body* @param user* @return*/@PostMapping(value = "/validate-mono-json-body",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)@ResponseBodypublic Mono<String> requestBodyValidate(@Validated @RequestBody Mono<User> user) {return user.map(u -> "Hello " + u.getName()).onErrorResume(WebExchangeBindException.class, e -> Mono.just(bindingResult2String(e.getBindingResult())));}

注意这里catch住WebExchangeBindException

通过ExceptionHandler处理WebExchangeBindException

  • ExceptionHandler
    @ExceptionHandler(WebExchangeBindException.class)@ResponseStatus(HttpStatus.BAD_REQUEST)@ResponseBodypublic String handleBindException(WebExchangeBindException bindException) {return bindingResult2String(bindException.getBindingResult());}
  • from表单提交
    /*** curl -i -X POST -d 'id=-1&name=a&age=10' http://localhost:8080/user/validate-mono** curl -i -X POST -d 'id=2&name=a&age=10' http://localhost:8080/user/validate-mono** curl -i -X POST -d 'id=2&name=a&age=30' http://localhost:8080/user/validate-mono* @param user* @return*/@PostMapping(value = "/validate-mono",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)public Mono<String> formValidate(@Validated Mono<User> user) {return user.map(u -> "Hello " + u.getName());}

注意这里要标注produces = MediaType.APPLICATION_JSON_UTF8_VALUE,否则报406 Not Acceptable

  • post json
    /*** curl -i -H "Content-Type: application/json" -X POST -d '{"id":-11,"name":"a"}' http://localhost:8080/user/validate-mono-json-body** curl -i -H "Content-Type: application/json" -X POST -d '{"id":12,"name":"a","age":30}' http://localhost:8080/user/validate-mono-json-body* @param user* @return*/@PostMapping(value = "/validate-mono-json-body",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)@ResponseBodypublic Mono<String> requestBodyValidate(@Validated @RequestBody Mono<User> user) {return user.map(u -> "Hello " + u.getName());}

注意这里没有使用onErrorResume来处理WebExchangeBindException,而是交给ExceptionHandler处理

手工校验

javax.validation虽然是方便,但是具体业务场景非常复杂,不是简单的单个字段校验就完事的,有的需要关联校验,这个时候javax.validation就无能为力了。这个时候可能就需要手工来写校验。

    /*** curl -i -X POST -d 'id=-1&name=a&age=10' http://localhost:8080/user/manual-validate** curl -i -X POST -d 'id=2&name=a&age=-1' http://localhost:8080/user/manual-validate* @param user* @return*/@PostMapping(value = "/manual-validate",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)public Mono<String> manualValidate(Mono<User> user){return user.flatMap(u -> {if(u.getAge() < 0){return Mono.error(new RuntimeException("age < 0"));}else{return Mono.just("success");}});}

小结

通过使用javax.validation自动校验及Mono.error手工校验,基本可以处理大多数webflux参数校验场景。

doc

  • Webflux-Validation
  • How to validate Mono when using Spring Reactive

转载于:https://my.oschina.net/go4it/blog/1633600

聊聊webflux参数校验相关推荐

  1. SpringBoot 如何进行参数校验,老鸟们都这么玩的!

    大家好,我是飘渺. 前几天写了一篇 SpringBoot如何统一后端返回格式?老鸟们都是这样玩的! 阅读效果还不错,而且被很多号主都转载过,今天我们继续第二篇,来聊聊在SprinBoot中如何集成参数 ...

  2. SpringMVC + Hibernate-Validator 参数校验

    2019独角兽企业重金招聘Python工程师标准>>> 前言: Web开发中,最为常见的场景就是前端表单数据.Json数据与后端实体类的绑定,即使JS能校验并阻止大部分的必填漏填的风 ...

  3. Spring Validation最佳实践及其实现原理,参数校验没那么简单!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:六点半起床 juejin.im/post/685654110 ...

  4. SpringBoot实现通用的接口参数校验

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:cipher juejin.im/post/5af3c25b ...

  5. 二胖写参数校验的坎坷之路

    背景 最近端午好久没有和二胖聚一聚了,于是约了二胖到人民广场去宰他一顿,正好最近他跳槽加薪了. 我:二胖听说你最近跳槽了,并且还是从传统软件公司跳到了互联网公司,工资是不是涨了一点啊,今天你请客哈. ...

  6. java 接口参数验证_SpringBoot实现通用的接口参数校验

    作者:cipher 来源:http://39sd.cn/560BA 本文介绍基于Spring Boot和JDK8编写一个AOP,结合自定义注解实现通用的接口参数校验. 缘由 目前参数校验常用的方法是在 ...

  7. Vue学习小札——2.6 组件参数校验与非props特性

    <div id="app"><child content="{'a':1}"></child></div>< ...

  8. Spring Boot 2.x基础教程:JSR-303实现请求参数校验

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | didispace.com/spring-boot-learni ...

  9. boot spring 对参数检测_【springboot】@Valid参数校验

    转自: https://blog.csdn.net/cp026la/article/details/86495659 扯淡: 刚开始写代码的时候对参数的校验要么不做.要么写很多类似 if( xx == ...

最新文章

  1. halcon:(4)halcon中XLD的概念与应用----汽车引擎盖圆孔检测
  2. 内核中的内存申请:kmalloc、vmalloc、kzalloc、kcalloc、get_free_pages【转】
  3. npm无法安装node-sass的解决方法
  4. shell-1-命令与参数
  5. 经典DL论文研读(part4)--ImageNet Classification with Deep Convolutional Neural Networks
  6. clear nTotal nNum=1计算机考试,信息学奥赛常考算法——模拟法
  7. docker build run 卡住_还在使用第三方Docker插件?SpringBoot官方插件真香!
  8. 万源之源之drupal7
  9. 微软发布企业安全进度报告 云应用安全服务即将面世
  10. iperf3使用方法说明
  11. OpenNLP初尝试--自然语言处理
  12. 老中医化妆品效果怎么样?舒缓系列拒绝敏感肌肤困扰
  13. C#查询自己的公网IP接口(有服务器)
  14. 小人数字时钟安卓版本APP
  15. 程序员求职之道(《程序员面试笔试宝典》)之走进微软
  16. Vue-Router的push和replace方法[Uncaught (in promise) Error]解决方案
  17. iPhone键盘自定义及通知
  18. 有哪些免费扫图识别文字的方法?方法要选对
  19. ZZULIOJ 2746: 布丁(BFS)
  20. DL/T645-2007通信协议指令学习记录

热门文章

  1. python爬虫正则表达式实例-python爬虫学习三:python正则表达式
  2. zerodivisionerror什么意思python-python代码里出现是啥意思
  3. python语言怎么输入-python/基础输出输入用法
  4. Opengl-基本概念-纹理(单纯的颜色太单调弄张图显示不是更好)
  5. Interviews(内连接,左外连接,分组、聚合)
  6. The Report(连接查询)
  7. CheckBox的使用(四):ListView中的项设置为可以多选
  8. HDU2072 单词数
  9. elasticsearch的映射(mapping)和分析(analysis)
  10. HDU 1712 裸分组dp