由于controller是调用的第一层,经常参数校验将在这里完成,常见有非空校验、类型校验等,常见写法为以下伪代码:

public void round(Object a){if(a.getLogin() == null){return "手机号不能为空!";}
}

但是调用对象的位置会有很多,而且手机号都不能为空,那么我们会想到把校验方法抽出来,避免重复的代码。但有框架支持我们通过注解的方式进行参数校验。

先立个场景,为往动物园添加动物,动物对象如下,时间节点大概在3030年,我们认为动物可登陆动物专用的系统,所以有password即自己的登录密码。

public class Animal {private String name;private Integer age;private String password;private Date birthDay;
}

调用创建动物的controller层如下,简洁明了,打印下信息后直接返回。

@RestController
@RequestMapping("/animal")
public class AnimalController {@PostMappingpublic Animal createAnimal(@RequestBody Animal animal){logger.info(animal.toString());return animal;}
}

伪造Mvc调用的测试类。

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestAnimal {private final static Logger logger = LoggerFactory.getLogger(TestAnimal.class);@Autowiredprivate WebApplicationContext wac;private MockMvc mockMvc;@Beforepublic void initMock(){mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();}@Testpublic void createAnimal() throws Exception {String content = "{\"name\":\"elephant\",\"password\":null,\"birthDay\":"+System.currentTimeMillis()+"}";String result = mockMvc.perform(MockMvcRequestBuilders.post("/animal").content(content).contentType(MediaType.APPLICATION_JSON_UTF8)).andExpect(MockMvcResultMatchers.status().isOk()).andReturn().getResponse().getContentAsString();logger.info(result);}
}

以上代码基于搭建的springboot项目,想搭建的同学可以参考姊妹搭建篇  https://blog.csdn.net/FU250/article/details/80208261

代码分析,日期格式的参数建议使用时间戳传递,以上birthDay传递 "2018-05-08 20:00:00",将会抛出日期转换异常,感兴趣的同学可以试试。

由于密码很重要,现在要求密码为必填,操作如下,添加@NotBlank注解到password上:

@NotBlank
private String password;

但光加校验注解是不起作用的,还需要在方法参数上添加@Valid注解,如下:

@Valid @RequestBody Animal animal

此时执行测试方法,抛出异常,返回状态为400:

java.lang.AssertionError: Status
Expected :200
Actual   :400<Click to see difference>at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:54)at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:81)

说明对password的非空校验已经生效了,直接抛出异常。如果不想抛出异常,想返回校验信息给前端,这个时候就需要用到BindingResult了,修改创建动物的方法,添加BindingResult参数:

@PostMappingpublic Animal createAnimal(@Valid @RequestBody Animal animal, BindingResult bindingResult){if (bindingResult.hasErrors()){bindingResult.getAllErrors().forEach(o ->{FieldError error = (FieldError) o;logger.info(error.getField() + ":" + error.getDefaultMessage());});}logger.info(animal.toString());return animal;}

此时,执行测试,可以看到日志中的错误信息:

2018-05-09 00:59:37.453  INFO 14044 --- [           main] c.i.s.d.web.controller.AnimalController  : password:may not be empty

为了满足我们编码需要我们需要进行代码改造,1.不能直接返回animal。2.返回的提示信息得是用户可读懂的信息。

controller方法改造如下,通过Map对象传递请求成功后的信息或错误提示信息。

@PostMappingpublic Map<String,Object> createAnimal(@Valid @RequestBody Animal animal, BindingResult bindingResult){logger.info(animal.toString());Map<String,Object> result = new HashMap<>();if (bindingResult.hasErrors()){FieldError error = (FieldError) bindingResult.getAllErrors().get(0);result.put("code","400");//错误编码400result.put("message",error.getDefaultMessage());//错误信息return result;}result.put("code","200");//成功编码200result.put("data",animal);//成功返回数据return result;}

返回的密码提示信息如下:

@NotBlank(message = "密码不能为空!")
private String password;

执行测试方法,返回结果

com.imooc.security.demo.TestAnimal       : {"code":"400","message":"密码不能为空!"}

最后贴一个,设置password值返回成功的信息

com.imooc.security.demo.TestAnimal       : {"code":"200","data":{"name":"elephant","age":null,"password":"lalaland","birthDay":1525799768955}}

最后完结,由于篇幅有限,下次会以这个实例为基础,实现一个自定义的注解实现,该篇文章到此结束,阅读有任何问题请及时反馈

使用@Valid+BindingResult进行controller参数校验相关推荐

  1. @Valid参数校验

    今天就简要描述一下在日常的开发工作中,所需要用到的参数校验. 主要有2种,一个是@Valid,一个是@Validated @Valid JSR303 是一套JavaBean参数校验的标准,它定义了很多 ...

  2. springboot使用validator进行参数校验

    前言 公司项目是前后端分离的,为了保证前端传输数据的合法性,对参数进行校验就很有必要.hibernate-validator就是一个不错的参数校验的解决方法.spring-boot-starter-w ...

  3. SpringBoot Validation优雅的参数校验

    前言:大多数项目中都需要后台对传过来的对象进行校验,所以经常需要写一些字段校验的代码,比如特殊字段非空.字段长度限制和邮箱格式验证等等.之前我们可能都是使用if-else-,写这些与业务逻辑关系不大的 ...

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

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

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

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

  6. 参数校验放在controller还是service_@Validated校验的实践

    spring-boot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理. 一.简单使用 1.Controller上开启验证 2.DTO上申明被验证的字段 a. ...

  7. notnull注解_参数校验注解Validated和Valid的区别,这次终于有人说清楚了

    Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR- ...

  8. Spring Mvc Controller返回值、参数绑定、参数校验 (高级二)

    1,Controller 返回值 返回moduleAndView 返回 String 返回void 2,Controller 参数绑定 客户端请求携带的key/value 键值对 绑定到 Contro ...

  9. @valid 校验_一文带你快速入手 Spring Boot 参数校验

    点击上方"Java专栏",选择"置顶或者星标" 第一时间阅读精彩文章! ☞ 程序员进阶必备资源免费送「21种技术方向!」 点击查看☜ 作者:狂乱的贵公子 来源: ...

最新文章

  1. C++编译器会对没有构造函数的类生成默认构造函数吗?
  2. Hibernate框架--学习笔记(下):hibernate的查询方式、多表查询、检索策略、批量抓取
  3. java用while循环语句输出1-100内的奇数和
  4. 【转】VC动态内存分配PPT
  5. CentOS “libc.so.6: version ‘GLIBC_2.14‘ not found“解决方法,同理‘GLIBC_2.15‘ not found“
  6. Matlab实现批量修改文件名
  7. Oracle中将0x1D转为字符,orcle導入大數據文件
  8. 学生社区(学校交流社区)网站源码推荐
  9. SVN 版本回退 命令行
  10. 检测网站CDN是否生效
  11. 对话Huobi Prime首发项目TOP:李林80%的时间都在问项目能否落地
  12. 电动自行车,电动滑板车出口欧盟CE认证怎么办理通过
  13. Jmeter压测报告
  14. H5如何获取内网IP和公网IP
  15. 已解决-Parallels Desktop 16 网络初始化失败:您的虚拟机将继续正常运作,但将无法连接网络
  16. [CTSC2016]时空旅行(斜率优化+线段树分治)
  17. galera-mariadb集群
  18. 【Python_PyQtGraph 学习笔记(四)】基于PyQtGraph设置槽函数,实现保存图片到本地的功能
  19. 01. Java8-Lambada 表达式
  20. 数字化转型 — 新能源汽车 — 生产制造流程 — Overview

热门文章

  1. TAP 系列文章6 | TAP的应用模型
  2. 走路步数怎么在屏幕上显示_华为走步步数不在屏幕上显示如何设置
  3. PlayerMaker小球随机弹跳练习
  4. Jersey中文版指南
  5. 猜数字游戏~~~~~~
  6. 无向图判断是否为欧拉回路(以HDU1878为板子题)
  7. 各linux桌面性能比较,七大顶级桌面比较!Linux平台自由选择
  8. android 虹软 例子,虹软免费人脸识别 Demo [Android]
  9. 三万五千字长文!让你懂透编译原理(六)——第六章 属性文法和语法制导翻译
  10. 143-再谈mtx和lock_guard和unique_lock