一般推荐与业务无关的放在Controller层中进行校验,而与业务有关的放在Service层中进行校验。那么如何将参数校验写的优雅美观呢,如果都是if - else,就感觉代码写的很low。看起来也不好看。也不利于理解。
Hibernate Validate可以完美解决这些问题。
引入依赖
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.3.1.Final</version>
</dependency>
常见的注解
- @Length(min=,max=) 检查所属的字段的长度是否在min和lmax之间,但只能用于字符串
- @Range(min=,max=,message=“****”) 被注释的元素必须在合适的范围内
- @Max 该字段的值(必须是一个数字)只能小于或等于该值
- @Min 该字段的值(必须是一个数字)只能大于或等于该值
- @DecimalMin(value) 被注释的元素必须是BigDecimal类型,其值必须大于等于指定的最小值
- @DecimalMax(value) 被注释的元素必须是BigDecimal类型,其值必须小于等于指定的最大值
- @Null 被注释的元素必须为 null
- @NotNull 不能为null但可以为空串
- @NotBlank 不能为空,检查时会将空格忽略
- @NotEmpty 不能为空,这里的空是指空字符串
- @AssertTrue 被注释的元素必须为 true
- @AssertFalse 被注释的元素必须为 false
- @Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
- @Size(max=, min=) 被注释的元素的大小必须在指定的范围内
- @Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
- @Past 被注释的元素必须是一个过去的日期
- @Future 被注释的元素必须是一个将来的日期
- @Email 被注释的元素必须是电子邮箱地址
需要搭配在Controller中搭配@Validated或@Valid注解一起使用,不然不起作用 @Validated和@Valid注解区别不是很大。参考下面这个demo
实体
@Data
@ApiModel
public class AddAnchorDTO {
@ApiModelProperty(value = "微信号")
@NotNull(message = "微信号不能为空")
@Pattern(regexp = Validator.WE_CHAT_NUM, message = "微信号格式不正确")
private String weChat;
@ApiModelProperty(value = "主播昵称")
@NotNull(message = "主播昵称不能为空")
@Length(min = 2, max = 15, message = "主播昵称长度不符合要求")
private String anchorNickName;
@ApiModelProperty(value = "真实姓名")
@NotNull(message = "真实姓名不能为空")
@Length(min = 2, message = "真实姓名长度不符合要求")
private String realName;
@ApiModelProperty(value = "身份证号")
@NotNull(message = "身份证号不能为空")
@Pattern(regexp = Validator.REGEX_ID_CARD, message = "身份证号格式不正确")
private String idCardNumber;
@ApiModelProperty(value = "身份证正面照片")
@NotNull(message = "身份证正面照片不能为空")
private String cardFrontPhoto;
@ApiModelProperty(value = "身份证背面照片")
@NotNull(message = "身份证背面照片不能为空")
private String cardBackPhoto;
@ApiModelProperty(value = "本人正面照片")
@NotNull(message = "本人正面照片不能为空")
private String facePhoto;
@ApiModelProperty(value = "联系电话")
@NotNull(message = "联系电话不能为空")
@Pattern(regexp = Validator.REGEX_MOBILE, message = "手机号格式不正确")
private String phone;
}
controller
@PostMapping("/add")
@ApiOperation(value = "申请主播")
public Result<Boolean> addAnchor(@RequestBody @Validated AddAnchorDTO dto) {
return new Result<>(anchorService.addAnchor(dto));
}
可以说是非常的优雅。