参数装配
在一个Http请求中,请求数据存放于Request对象
中.而Spring MVC
将会把Request对象
中的数据,赋值到Controller
方法体参数中,而不需要开发者再从Request中
读取.
这个行为称之为参数装配
.
常用注解
使用Spring MVC
提供的注解,可定义Controller方法体参数与Request对象中数据的映射关系。常用注解包括:
@PathVariable
装配地址中的数据
@RequestParam
装配Form方式提交的数据
@RequestBody
装配Payload方式提交的数据
@ModelAttribute
装配Form方式提交的数据,使其成为对象参数中的属性.
@RequestHeader
装配Header中的数据
其他参数
在Controller方法体中,如果是以下参数类型,可以不用添加注解,Spring MVC将默认注入该值。
- HttpServletRequest
与ServletRequest
- HttpServletResponse
与ServletResponse
- 在当前Controller
或ControllerAdvice
作用域中的@ModelAttribute
方法的返回值.
ModelAttribute的使用
自定义的参数解析器 – HandlerMethodArgumentResolver
参数校验
Spring Boot
中默认集成了Spring Validator
与Hibernate Validator
.
校验用注解
Spring Validator
注解 | 数据类型 | 说明 |
---|---|---|
@Null | 任意类型 | 必须为空 |
@NotNull | 任意类型 | 必须不为空 |
@AssertFalse | boolean,Boolean | 注解布尔值为false |
@AssertTrue | 同@AssertFalse | 注解布尔值为true |
@Max(value=值) | BigDecimal,BigInteger, byte,short, int, long,等任何Number | 设置最大值 |
@Min(value=值) | 同@Min | 设置最小值 |
@DecimalMax(value=值) | 同@Min | 设置最大值 |
@DecimalMin(value=值) | 同@Min | 设置最大值 |
@Digits(integer=整数位数,fraction=小数位数) | 同@Min | 设置整数位和小数位 |
@Future | java.util.Date,java.util.Calendar;Joda Time类库的日期类型 | 比当前时间晚 |
@Past | 同@Future | 比当前时间早 |
@Size(min=最小值,max=最大值) | 字符串、Collection、Map、数组等 | 长度 |
@Pattern(regexp=正则表达式) | String | 匹配正则表达式 |
- Hibernate Validator
注解
注解 | 数据类型 | 说明 |
---|---|---|
@Range(min=最小值, max=最大值) | 同@Min | 验证注解的元素值在最小值和最大值之间 |
@URL | String | 校验URL格式 |
String | 校验Email格式 | |
@NotBlank | String | 不为null,不为”“ |
@NotEmpty | 任意类型 | 不为null,字符串长度不为0,集合大小不为0 |
使用方法
对简单数据类型的校验
- 在类上添加
@Validated
注解 - 在参数上添加
Spring Validator
注解
@RestController
@RequestMapping("/api")
@Validated
public class HelloContrller {
@GetMapping("/say/{id}")
public String sayHello(@Min(value=1,message="id不为负数") @PathVariable Long id){
return id + " say : Hello World";
}
}
对实体类的校验
- 在实体类的属性或getter方法上添加
Spring Validator
注解 - 在方法参数上添加
@Validated
注解 - 实体类参数,无法校验对象属性内部的属性.
public class User {
@Null(message="必须为空")
private Long id;
@NotNull(message="name不能为空")
private String name;
private Boolean sex;
private String description;
@NotNull(message = "不能为空")
private Company company;
}
@PostMapping("/b")
public User add02(@RequestBody @Validated User user){
System.out.println(user);
return user;
}
分组实体类参数的不同校验规则
- 在实体类的属性或getter方法上添加
Spring Validator
注解.并在注解上添加groups值 - 在方法参数上添加
@Validated
注解,并指定group值 - 当Spring Validator注解的groups包含
@Validated
注解的value,该Spring Validator
注解才生效
@Null(groups = ValidFor.Add.class,message="必须为空")
@Validated(value = ValidFor.Add.class)