我有一个应用程序,我可以在其中创建和编辑组。每个小组都有一个独特的标题。当有人尝试创建新组时,我会检查是否有一个具有该标题的组,如果有,则验证失败。问题是当有人试图编辑组并且没有更改标题时,根据我的自定义验证,有一个具有该标题的组(某人正在编辑的那个)并且我的验证失败,因此用户无法保存该组。所以我想问一下是否有人可以解决这个问题。非常感谢您的回答!
我的小组课程
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;
}
}
答案 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-persist
,javax.persistence.validation.group.pre-update
和javax.persistence.validation.group.pre-remove
,您可以配置每个生命周期事件类型验证哪些组。在您的情况下,您可以将javax.persistence.validation.group.pre-persist
设置为javax.validation.Default, <mypackage>.AtInsertOnly
。
这些属性应添加到您的persistence.xml
。