Hibernate 使用列表验证对象
Hibernate validate object with a list
我有用户 class,角色列表:
@Data
@Table(name = "users")
@Entity
public class User {
String username;
String password;
List<Role> roles;
}
角色枚举:
public enum Role {
Admin,User,Manager
}
我需要在将 bean 插入数据库之前对其进行验证。验证表达式应如下所示:
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);
}
}
但它不起作用。我还找到了一个解决方案 here 但我无法将列表包装在 beanList 中,因为很多其他 classes 都依赖于此 class。有没有其他方法可以解决这个问题。接受任何建议
由于您正在验证 User
,因此您可以让注释与用户一起使用。让注释在 classes:
上工作
@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;
}
}
然后在 User
class 上应用 @RoleConstraint
。
我有用户 class,角色列表:
@Data
@Table(name = "users")
@Entity
public class User {
String username;
String password;
List<Role> roles;
}
角色枚举:
public enum Role {
Admin,User,Manager
}
我需要在将 bean 插入数据库之前对其进行验证。验证表达式应如下所示:
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);
}
}
但它不起作用。我还找到了一个解决方案 here 但我无法将列表包装在 beanList 中,因为很多其他 classes 都依赖于此 class。有没有其他方法可以解决这个问题。接受任何建议
由于您正在验证 User
,因此您可以让注释与用户一起使用。让注释在 classes:
@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;
}
}
然后在 User
class 上应用 @RoleConstraint
。