Jsr303分組校驗和自定義注解校驗


分組校驗

在某些需求中,不同的接口對同一個對象的參數的需求是不同的。

例如:新增接口不需要傳入對象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文件亂碼,我們需要手動改一下字符集:

image-20201013090057420

在需要校驗的字段上加自定義注解:

    @NotNull(groups = {AddGroup.class,UpdateGroup.class})
    @ListValue(values={1,0},groups = {AddGroup.class,UpdateGroup.class})
    private Integer showStatus;

這時候,自定義注解就會生效。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM