繁体   English   中英

Hibernate 用列表验证 object

[英]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 插入 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 中,因为很多其他类都依赖于这个 class。有没有其他方法可以解决这个问题。 任何建议都可以接受

由于您正在验证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;
    }
}

然后在User class 上应用@RoleConstraint

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM