分組校驗
在某些需求中,不同的接口對同一個對象的參數的需求是不同的。
例如:新增接口不需要傳入對象id,修改接口需要傳入對象的id。如果對象id
是Long類型的,那么我們可以在id上標注@Null表示該參數必須為null,@NotNull表示該參數不能為Null。
@NotNull(message = "修改必須指定id")
@Null(message = "新增不能指定id")
@TableId
private Long id;
這時候我們可以對@NotNull和@Null進行分組。
我們新建兩個空的接口進行標注:
public interface AddGroup {
}
public interface UpdateGroup {
}
@NotNull(message = "修改必須指定id",groups = {UpdateGroup.class})
@Null(message = "新增不能指定id",groups = {AddGroup.class})
@TableId
private Long brandId;
在controller層,也需要進行標注該接口屬於那個分組下的,在@Validated注解中進行標注。
@PostMapping("/save")
public R save(@Validated({AddGroup.class}) @RequestBody Entity entity) {
entityService.save(entity);
return R.ok();
}
@PostMapping("/update")
public R update(@Validated({UpdateGroup.class})@RequestBody Entity entity) {
entityService.updateById(entity);
return R.ok();
}
這時候,分組校驗就會生效。
自定義注解校驗
但是有時候需求較為復雜,Jsr303的校驗注解已經不夠使用了。
例如,某個字段只能傳入0,1,2這三個值,我們可以自定義注解。
新建@ListValue注解:
@Documented
@Constraint(validatedBy = { ListValueConstraintValidator.class})
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface ListValue {
String message() default "{com.wj.common.valid.ListValue.message}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
int[] values() default {};
}
新建該校驗注解的校驗器:
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {
private Set<Integer> set = new HashSet<>();
@Override
public void initialize(ListValue constraintAnnotation){
int[] values = constraintAnnotation.values();
for(int i : values){
set.add(i);
}
}
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
return set.contains(value);
}
}
在resources目錄下新建validationMessages.properties文件:
com.wj.common.valid.ListValue.message=必須包含指定的值
注意,有可能讀取出來的properties文件亂碼,我們需要手動改一下字符集:
在需要校驗的字段上加自定義注解:
@NotNull(groups = {AddGroup.class,UpdateGroup.class})
@ListValue(values={1,0},groups = {AddGroup.class,UpdateGroup.class})
private Integer showStatus;
這時候,自定義注解就會生效。