Spring Boot实际运用解说(三):表单验证

请步向这里获得授权:

本文运营条件

文/ZYCR-Vzyr原来的文章链接:

表单验证,即校验客户提交的数据的成立,如是否为空,数据长度,数据类型等等,好的证实,能防止垃圾数据的发生。

就此那一个到底是如何鬼?反正小编是不亮堂。经过和谐长日子的使用与对标准的言情,再增多平常的互联网互动中,使用最多的是HTTP切磋,所以本身总括出的在HTTP共谋基础下的REST即:

spring: profiles: active: pro #使用生成环境配置

文/ZY奥迪Q7zyr原版的书文链接:

  1. UserController的类名三巳了@RestController,还应该有一个@RequestMapping,表示URLlocalhost:8080/user
  2. @GetMapping@PostMapping@PutMapping@DeleteMapping:对应的该格局的访谈格局分别是GETPOSTPUTDELETE,其括号中的值接在上或多或少的末端,如:localhost:8080/user/users
  3. ResponseEntity<T>奥门金沙网址,:响应实体,在那之中可含蓄数据与状态码,或只含有状态码。

application.yml改为:

正文介绍了Spring Boot金沙澳门官网网址,是怎样利用注明,就会便于的进展表单验证的。

在上一篇文章中的UserController中新增加以下情势,分别对应GETPOSTPUTDELETE,4种央求方式:

是因为涉及内容相当多,本连串暂不张开细讲。

运营测量试验用例,全部中标,表明正确。

貌似接纳名词并不是动词来定义URL,比如:api.example.com/version/products而不是api.example.com/version/getProducts意味着收获商品。

一本书的习性包涵:书名、价格、页数等,定义三个Book类,如下:

Ubuntu 16.04 LTSJDK 8 +IntelliJ IDEA ULTIMATE 2017.2Maven 3.5.0Spring Boot 1.5.8.RELEASE

要是一种情景:有一个APIPOST伸手,央求参数是nameage,其中age有贰个后台验证,小于18则不增加并赶回错误消息,当顾客端调用此API时,age=11,此时不满足后台验证,重返了错误音讯必须是成年人,状态码是200.

正文介绍了实际支出中Spring Boot常用的布局情形,关于application.yml中详细的配备表明,请参见官方认证。

持续将推出以下小说,敬请关切!

GET——获取能源POST——新建能源(少之甚少情状下也可用于更新)PUT——更新财富PATCH——更新能源(对一些财富的换代,非常少使用,某个类库不支持)DELETE——删除能源

  1. 命令行参数
  2. 来自java:comp/env的JNDI属性
  3. Java系统质量(System.getProperties
  4. 操作系统情形变量
  5. RandomValuePropertySource 属性类生成的 random.* 属性
  6. 选取以外的 application.yml(或 properties)(带spring.profile)文件
  7. 包裹在选择内的 application.yml(或 properties)(带spring.profile)文件
  8. 运用以外的 application.yml(或 properties)(不带spring.profile)文件
  9. 包裹在应用内的 application.yml(或 properties)(不带spring.profile)文件
  10. @Configuration评释类上的@PropertySource
  11. SpringApplication.setDefaultProperties 评释的私下认可属性
  1. signUpPOST伸手参数即为User类中的字段名:nameagepasswordSpring Boot会将其机动组合成User实例;
  2. @Valid:表示该参数必要张开表达,验证点即为上边User类中的字段上的各申明;
  3. BindingResult:此参数包括错误音信,即User字段注脚中的message
  4. signUp措施打字与印刷诉求参数的值,若未通过验证则赶回错误信息,错误消息即User类字段评释中的message,若验证成功直接回到success

本文提纲一、RESTful API通俗解释二、为什么选择它三、实例四、最终

#Book.java的属性book: name: ${random.value} #赋值随机字符串 price: ${random.int} #赋值随机整数 page: ${random.int} #赋值随机整数

文中若有错之处,还请各位顶牛指正,感谢!

到此,看似一切都很正规:诉求成功,何况也是有错误新闻。但熟稔HTTP状态码的话就能开掘:明明已经回来错误音讯了,表明出错了,但要么回到了表示成功的200,那让客商端在做拍卖时面前遇到一种比较为难的情事:供给在success中写错误管理逻辑。

Spring Boot提供了众多暗中同意配置,无需张开呈现注明,何况大大多的默许配置已经能满足实际的支付,节省了数不完光阴。日常多个moudle中的配置文件为:application.ymlapplication.properties,里面能够注解如数据库连接、tomcat、缓存等等非常多的计划,可依据项目实在需求实行配置。.yml.properties有别于仅在于.yml使用YAML语法实草书写,更方便人阅读,所以本种类小说,均选择.yml作为后缀的安插文件。某个情形下,须求更换配置参数,譬如项目周转时打开布置参数修改,需求遵守以下配置优先级:

原版的书文笔者/ZYLANDzyr原来的书文链接:

3.2.1 单元测量试验

UserControllerTest中增加如下测验用例:

 @Test public void testRegister_success() throws Exception { mockMvc.perform(MockMvcRequestBuilders.post("/user/register") .param("name", "Bob") .param("age", "20") .param("password", "123456")) .andExpect(MockMvcResultMatchers.status .andExpect(MockMvcResultMatchers.content().string("success")); } @Test public void testRegister_age_error() throws Exception { mockMvc.perform(MockMvcRequestBuilders.post("/user/register") .param("name", "Bob") .param("age", "10") .param("password", "123456")) .andExpect(MockMvcResultMatchers.status().isBadRequest//age=10,验证不通过,返回状态码400 .andExpect(MockMvcResultMatchers.content().string); } @Test public void testGetUsers() throws Exception { mockMvc.perform(MockMvcRequestBuilders.get("/user/users")) .andExpect(MockMvcResultMatchers.status .andExpect(MockMvcResultMatchers.content().json("[{\"name\":\"Bob\",\"age\":20,\"password\":\"123456\"},{\"name\":\"Tom\",\"age\":22,\"password\":\"654321\"}]")); } @Test public void testUpdateUser() throws Exception { mockMvc.perform(MockMvcRequestBuilders.put("/user/profile") .param("name", "new") .param("age", "30") .param("password", "555555")) .andExpect(MockMvcResultMatchers.status .andExpect(MockMvcResultMatchers.content().json("{\"name\":\"new\",\"age\":30,\"password\":\"555555\"}")); } @Test public void testDelete() throws Exception { mockMvc.perform(MockMvcRequestBuilders.delete("/user/user")) .andExpect(MockMvcResultMatchers.status .andExpect(MockMvcResultMatchers.content().string; }

运作,全体经过

IDEA自带API测量试验工具,张开Tools->Test RESTful Web Service:

金沙澳门官网网址 1REST Client.png

个别输入HTTP methodHost/portPath,若有央求参数,在RequestRequest Parameters中增加参数,完结之后,点侧边浅原野绿第三个播放开关,就能够运维。运营之后,可在Response中查阅重返数据,在Response Headers中首先行查看状态码。

本文先介绍了RESTful API的有的基本概念,后又在Spring Boot中实例演示。这次代码为了演示必要,在UserController中有那个再度代码,何况代码耦合严重,这一个标题将会随着本种类小说的推出而稳步消除。

正文代码已上传至自家的GitHub饭馆,步入现在将branches切换为4-RESTful就能够见到。

前篇:Spring Boot实际应用讲授:Hello WorldSpring Boot实际利用讲授:配置详解Spring Boot实际利用疏解:表单验证

持续将推出以下文章,敬请关怀!

Spring Boot实际选取批注:AOP之须要日志Spring Boot实际运用讲明:MySQL + Spring-data-jpa(Hibernate)Spring Boot实际行使疏解:统一相当管理Spring Boot实际使用解说:MySQL + MybatisSpring Boot实际使用讲授:MySQL + Mybatis + Redis

文中若有错之处,还请各位商讨指正,多谢!

初稿小编/ZYMuranozyr最先的作品链接:

请步入这里获得授权:

文中若有错之处,还请各位争辨指正,多谢!

package com.zyr.demo.controller;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;import org.springframework.test.web.servlet.MockMvc;import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;import org.springframework.test.web.servlet.result.MockMvcResultMatchers;@RunWith(SpringRunner.class)@SpringBootTest@AutoConfigureMockMvcpublic class UserControllerTest { @Autowired private MockMvc mockMvc; @Test public void testSignUp_success() throws Exception { mockMvc.perform(MockMvcRequestBuilders.post("/signUp") .param("name", "Bob") .param("age", "20") .param("password", "123456")) .andExpect(MockMvcResultMatchers.status .andExpect(MockMvcResultMatchers.content().string("success")); } @Test public void testSignUp_name_null() throws Exception { mockMvc.perform(MockMvcRequestBuilders.post("/signUp") .param("name", "") .param("age", "20") .param("password", "123456")) .andExpect(MockMvcResultMatchers.status .andExpect(MockMvcResultMatchers.content().string("用户名不能为空")); } @Test public void testSignUp_age_error() throws Exception { mockMvc.perform(MockMvcRequestBuilders.post("/signUp") .param("name", "Bob") .param("age", "10") .param("password", "123456")) .andExpect(MockMvcResultMatchers.status .andExpect(MockMvcResultMatchers.content().string); }}

RESTful API即具有REST风格的API,这什么是REST啊?网络有无数介绍怎样是REST的,但基本上都是当断不断的反驳,就算有耐心读完,也不必然能确实了然其意。比如上面这一小句:

近年来是付出条件,运维方面包车型地铁测量试验用例BookTest.test,调节台出口随机数的Book

注解 作用
@AssertFalse 验证boolean对象是否是false
@AssertTrue 验证boolean对象是否是true
@DecimalMax 验证 NumberString 对象是否小等于指定的值,小数存在精度
@DecimalMin 验证 NumberString 对象是否大等于指定的值,小数存在精度
@Digits 验证NumberString的构成是否合法
@Past 验证DateCalendar对象是否在当前时间之前
@Future 验证DateCalendar对象是否在当前时间之后
@Max 验证NumberString对象是否小等于指定的值
@Min 验证NumberString对象是否小等于指定的值
@NotNull 验证对象不为空
@Null 验证对象为空
@Pattern 验证String对象是否符合正则表达式的规则
@Size 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
 @GetMapping public ResponseEntity<List<User>> getUsers() { List<User> users = new ArrayList<>(); User user1 = new User(); user1.setName; user1.setAge; user1.setPassword; User user2 = new User(); user2.setName; user2.setAge; user2.setPassword; //模拟从数据库取出数据 users.add; users.add; return new ResponseEntity<>(users, HttpStatus.OK); } @PostMapping("/register") public ResponseEntity<String> register(@Valid User user, BindingResult bindingResult) { if (bindingResult.hasErrors { //如果验证出错,则返回错误信息,状态码400 return new ResponseEntity<>(bindingResult.getFieldError().getDefaultMessage(), HttpStatus.BAD_REQUEST); } return new ResponseEntity<>("success", HttpStatus.OK); } @PutMapping("/profile") public ResponseEntity<User> updateUser(User newUser) { User oldUser = new User(); oldUser.setName; oldUser.setAge; oldUser.setPassword; //假设oldUser为数据库中已存在数据,用newUser更新oldUser if (!TextUtil.isEmpty(newUser.getName { oldUser.setName(newUser.getName; } if (newUser.getAge() != null) { oldUser.setAge(newUser.getAge; } if (!TextUtil.isEmpty(newUser.getPassword { oldUser.setPassword(newUser.getPassword; } return new ResponseEntity<>(oldUser, HttpStatus.OK); } @DeleteMapping public ResponseEntity deleteUser(String name) { //省略数据库删除数据操作 return new ResponseEntity(HttpStatus.OK); }

前篇:Spring Boot实际使用讲解:Hello World

新建测验类UserControllerTest(此处未写完全体测量试验用例):

  1. 所有的code急需与顾客端重新定义,哪个值表示什么意思,一旦有涂改,供给再行规定,而RESTful API运用现存的HTTP状态码;
  2. 如果data中的格局复杂,深入分析起来很辛勤,而RESTful API直接再次回到须要的数码,尽管麻烦,始终少一层深入分析;
  3. 客商端的保有响应逻辑全都写在success中,对于追求代码品质的人的话,无法容忍这种两难的层面,而RESTful API设若有错,就会在error中操作;
  4. 看起来很标准,其实某个也不。

编写Book的测验类,如下: