springboot~自定義valid及DefaultGroupSequenceProvider的作用

spring一切都可以基於註解來實例,像緩存,校驗,字段映射,動態代理等等,今天主要說一下自定義的校驗及校驗的組關聯。

  • 自定義註解,判斷name需要以"管理員"結尾
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PrefixAdminValidator.class)
@Documented
public @interface PrefixAdmin {
    String message() default "必須以'角色'結尾";
    //這兩個屬性必須有
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
@Component
public class PrefixAdminValidator implements ConstraintValidator<PrefixAdmin, String> {

    @Override
    public void initialize(PrefixAdmin constraintAnnotation) {
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return value.endsWith("角色");
    }
}
  • 然後有個需求,只有字段manager爲true時,才進行PrefixAdminValidator的校驗,這時我們可以通過DefaultGroupSequenceProvider組依賴來實現
/**
 * 校驗的依賴,當isManager爲true爲,PrefixAdmin註解纔有效.
 */
public class RoleProvider implements DefaultGroupSequenceProvider<RoleDTO> {
    @Override
    public List<Class<?>> getValidationGroups(RoleDTO object) {
        List<Class<?>> defaultGroupSequence = new ArrayList<>();

        defaultGroupSequence.add(RoleDTO.class); //注意這裏不要寫錯
        if (object != null && object.isManager()) {
            defaultGroupSequence.add(RoleDTO.CheckManagerGroup.class);
        }
        return defaultGroupSequence;
    }
}
  • 實體在字段上添加對接的註解
@Data
@GroupSequenceProvider(RoleProvider.class)
@ApiModel("角色DTO")
public class RoleDTO {
    private String id;

    @PrefixAdmin(groups = CheckManagerGroup.class)
    private String name;

    private boolean manager;

    public interface CheckManagerGroup {
    }
}
  • 測試數據
  • 結果響應
{
    "code": 400,
    "message": "name必須以'角色'結尾",
    "data": null
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章