一 背景
在开发过程中,对于一些参数的校验,参数非空,参数长度限制,参数范围限制,嵌套结构参数校验等情况,用@Valid注解会省去很多手写的参数校验,简单又高效。
二 使用样例和姿势
1 校验的请求类
import io.swagger.annotations.ApiModelProperty;
import java.util.List;
import javax.validation.Valid;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
@Data
@NoArgsConstructor
public class PersonInformationReq {
@ApiModelProperty(value = "名称")
@NotBlank(message = "名称不能为空") // 指定【String】类型参数不能为空
@Length(min = 5, max = 10) // 指定【String】类型参数长度需要在【5, 10】范围内
private String name;
@ApiModelProperty(value = "年龄")
@NotNull(message = "年龄不能为空") // 指定【Integer】类型参数不能为空
@Max(100)
@Min(0) // 指定【Integer】类型参数需要在【0, 100】范围内
private Integer old;
@ApiModelProperty(value = "爱好 eg:['打篮球', '滑雪']")
@NotNull // 指定【List<T>】类型参数不能为空
@Size(min = 2, max = 5) // 指定【List<T>】类型的容量需要在【2, 5】范围内
private List<String> hobbies;
@ApiModelProperty(value = "联系人信息")
@Valid // 嵌套参数校验必须加这个注解!!!
private ContactReq contact;
}
import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotNull;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.NotBlank;
@Data
@NoArgsConstructor
public class ContactReq {
@ApiModelProperty(value = "联系人ID")
@NotNull // 指定【Long】类型参数不能为空
private Long contactId;
@ApiModelProperty(value = "工作电话")
@NotBlank // 指定【String】类型参数不能为空
private String workPhone;
@ApiModelProperty(value = "工作邮箱")
@NotBlank
private String workEmail;
@ApiModelProperty(value = "个人邮箱")
@NotBlank
private String personalEmail;
}
2 引用请求类
package com.bytedance.cg.robot.web.controller;
import com.bytedance.cg.robot.base.conf.TccConf;
import com.bytedance.cg.robot.base.req.LarkRobotReq;
import com.bytedance.cg.robot.web.biz.LarkRobotBiz;
import com.bytedance.cg.robot.web.req.PersonInformationReq;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
public class TestController {
@ApiOperation(value = "测试controller")
@PostMapping("/test")
public String Test(@RequestBody @Valid PersonInformationReq req) {
return "";
}
}
三 注意事项
如果提示javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint... 并且你用到了@NotBlank
注意引的包需要是hibernate包下的NotBlank