spring一切都可以基於註解來實例,像緩存,校驗,欄位映射,動態代理等等,今天主要說一下自定義的校驗及校驗的組關聯。 自定義註解,判斷name需要以"管理員"結尾 @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Con ...
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
}
作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!