【问题标题】:JSR-303 custom validator databaseJSR-303 自定义验证器数据库
【发布时间】:2015-07-31 20:37:20
【问题描述】:

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

我的小组课

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;
    }
}

【问题讨论】:

    标签: spring hibernate jpa bean-validation


    【解决方案1】:

    假设您正在使用 JPA(至少您用它标记了问题)并且当实体作为与 JPA 的 Bean 验证集成的一部分进行验证时出现问题,您可以配置每个 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, &lt;mypackage&gt;.AtInsertOnly

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

    【讨论】:

    • 非常感谢您的回答,但我找到了不同的解决方案。我参考了这个答案link 问题是我需要将另一个值传递给我的验证器,即ID,然后验证很容易。
    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 2019-02-03
    • 2016-06-21
    • 2015-01-10
    相关资源
    最近更新 更多