Spring JSR-303自定义验证程序数据库

Spring JSR-303自定义验证程序数据库,spring,hibernate,jpa,bean-validation,Spring,Hibernate,Jpa,Bean Validation,我有一个可以创建和编辑组的应用程序。每个小组都有一个独特的标题。当有人试图创建新组时,我会检查是否有具有该标题的组,如果有,验证将失败。问题是,当有人试图编辑组而不更改标题时,根据我的自定义验证,有一个组具有该标题(有人正在编辑的标题),而我的验证失败,因此用户无法保存该组。所以我想问一下,是否有人能解决这个问题。非常感谢您的回答 我的小组课 public class UserGroupData implements Serializable { private Long id; @NotNu

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

我的小组课

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 {};
@已记录
@约束(validatedBy=UserGroupTitleValidator.class)
@目标({ElementType.METHOD,ElementType.FIELD})
@保留(RetentionPolicy.RUNTIME)
public@interface UserGroupTitle{
字符串消息();
类[]组()默认值{};

类假设您正在使用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 persistent
javax.persistence.validation.group.pre-update
可以配置哪个组每个生命周期事件类型对组进行验证。在您的情况下,您可以将
javax.persistence.validation.group.pre persistent
设置为
javax.validation.Default,.atinly


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

非常感谢您的回答,但我找到了不同的解决方案。我提到了这个答案,问题是我需要将另一个值传递到我的验证器,即ID,这样验证就很容易了。
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 {
}