我有帶有角色串列的用戶類:
@Data
@Table(name = "users")
@Entity
public class User {
String username;
String password;
List<Role> roles;
}
和角色列舉:
public enum Role {
Admin,User,Manager
}
我需要在將 bean 插入 DB 之前對其進行驗證。驗證運算式應如下所示:
long count = user.getRoles().stream().filter(r -> r.equals(Role.Manager)).count();
!(count > 1);
用戶不能擁有多個經理角色,但對于其他角色,可以有重復;為此,我為他創建了一個自定義約束和一個驗證器:約束:
@Target({ ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = RoleValidator.class)
public @interface RoleConstraint {
String message() default "error";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
驗證器:
public class RoleValidator implements ConstraintValidator<RoleConstraint, List<Role>> {
@Override
public boolean isValid(List<Role> roles, ConstraintValidatorContext context) {
long count = roles.stream().filter(r -> r.equals(Role.Manager)).count();
return !(count > 1);
}
}
但它不起作用。我也在這里找到了一個解決方案,但我無法將串列包裝在 beanList 中,因為很多其他類都依賴于這個類。有沒有其他方法可以解決這個問題。任何建議都可以接受
uj5u.com熱心網友回復:
由于您正在驗證User,因此您可以讓您的注釋與用戶一起作業。對類進行注釋:
@Target({ ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = RoleValidator.class)
public @interface RoleConstraint {
String message() default "error";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
更改驗證器以與用戶一起使用:
public class RoleValidator implements ConstraintValidator<RoleConstraint, User> {
@Override
public boolean isValid(User user, ConstraintValidatorContext context) {
long count = user.roles.stream().filter(r -> r.equals(Role.Manager)).count();
//that's simpler, but is the same as '!(count > 1)'
return count <= 1;
}
}
然后申請上課@RoleConstraint。User
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/448514.html
下一篇:多個彈簧啟動物體上的自動增量ID
