需求
在某个接口的请求参数上有如下限制:
参数名称 | 说明 | 类型 | 是否必须 | 备注 |
---|---|---|---|---|
state | 发布状态 | string | 是 | 已发布 | 草稿 |
自定义注解State
// 元注解:将注解中的元素包含到Javadoc中去
@Documented
// 元注解:运用的地点
@Target({ElementType.FIELD})
// 元注解:存活时间
@Retention(RetentionPolicy.RUNTIME)
// 指定提供校验规则的类
@Constraint(validatedBy = {StateValidation.class})
public @interface State {
// 提供校验失败后的提示信息
String message() default "state参数的值只能是已发布或草稿";
// 指定分组
Class<?>[] groups() default {};
// 负载 获取到State注解的附加信息
Class<? extends Payload>[] payload() default {};
}
自定义校验数据的类StateValidation
public class StateValidation implements ConstraintValidator<State, String> {
/**
*
* @param value 将来要校验的数据
* @param constraintValidatorContext
* @return 返回false则校验不通过, 返回true则校验通过
*/
@Override
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
// 提供校验规则
if (value == null) {
return false;
}
if (value.equals("已发布") || value.equals("草稿")) {
return true;
}
return false;
}
}
在需要校验的地方使用自定义注解
校验对象类型:
实体类的成员变量上添加校验注解@NotNull@NotEmpty@Email,接口方法的实体类参数上添加@Validated注解
校验简单数据类型:
在控制器上添加@Validated注解,在接口方法的简单数据类型参数前面添加校验注解@NotNull@NotEmpty@Email
@State
private String state;//发布状态 已发布 |草稿
@Data
public class Article {
private Integer id;//主键ID
@NotEmpty
@Pattern(regexp = "^\\S{1,10}$")
private String title;//文章标题
@NotEmpty
private String content;//文章内容
@NotEmpty
@URL
private String coverImg;//封面图像
@State
private String state;//发布状态 已发布 |草稿
@NotNull
private Integer categoryId;//文章分类id
private Integer createUser;//创建人ID
private LocalDateTime createTime;//创建时间
private LocalDateTime updateTime;//更新时间
}
@RestController
@RequestMapping("/article")
public class ArticleController {
@Autowired
private ArticleService articleService;
// 新增文章
@PostMapping
public Result add(@RequestBody @Validated Article article) {
articleService.add(article);
return Result.success();
}
}