JSR-303自定义验证器数据库

时间:2015-05-19 20:21:57

标签: spring hibernate jpa bean-validation

我有一个应用程序,我可以在其中创建和编辑组。每个小组都有一个独特的标题。当有人尝试创建新组时,我会检查是否有一个具有该标题的组,如果有,则验证失败。问题是当有人试图编辑组并且没有更改标题时,根据我的自定义验证,有一个具有该标题的组(某人正在编辑的那个)并且我的验证失败,因此用户无法保存该组。所以我想问一下是否有人可以解决这个问题。非常感谢您的回答!

我的小组课程

public class UserGroupData implements Serializable {

private Long id;
@NotNull(message = "{NotNull.userGroupData.title}")
@Size(max = 20, message = "{Size.userGroupData.title}")
@UserGroupTitle(message = "{Unique.userGroupData.title}")
private String title;

我的验证器界面

    @Documented
@Constraint(validatedBy = UserGroupTitleValidator.class)
@Target( { ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface UserGroupTitle {


    String message();

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

我的验证员

public class UserGroupTitleValidator implements ConstraintValidator<UserGroupTitle, String> {
    @Autowired
    UserGroupRepo userGroupRepo;

    @Override
    public void initialize(UserGroupTitle paramA) {
    }

    @Override
    public boolean isValid(String UserGroupTitle, ConstraintValidatorContext ctx) {
        UserGroup userGroup = userGroupRepo.findOneByTitle(UserGroupTitle);

        if(userGroup!=null){
            return false;
        }
        return true;
    }
}

1 个答案:

答案 0 :(得分:0)

假设您正在使用JPA(至少用它标记了问题)并且当实体作为与JPA集成的Bean Validation集成的一部分进行验证时出现问题,您可以配置每个JPA生命周期类型验证哪些组。为此,您需要为UserGroupValidation分配一个组:

public class UserGroupData implements Serializable {

   private Long id;

   @NotNull(message = "{NotNull.userGroupData.title}")
   @Size(max = 20, message = "{Size.userGroupData.title}")
   @UserGroupTitle(message = "{Unique.userGroupData.title}", groups = AtInsertOnly.class)
   private String title;
}

public interface AtInsertOnly {
}

接下来,您需要告诉JPA在验证期间要定位哪些组。默认情况下,仅定位Default组。但是,通过javax.persistence.validation.group.pre-persistjavax.persistence.validation.group.pre-updatejavax.persistence.validation.group.pre-remove,您可以配置每个生命周期事件类型验证哪些组。在您的情况下,您可以将javax.persistence.validation.group.pre-persist设置为javax.validation.Default, <mypackage>.AtInsertOnly

这些属性应添加到您的persistence.xml