如何仅在字段不为null的情况下使用javax验证对其应用自定义验证



我正在Spring Boot应用程序中进行javax验证API。我有一个Userbean,我必须验证请求中给出的用户名是唯一的,并且不存在于数据库中。

我已经为此需求创建了自定义注释(UniqueUser.java(和自定义验证器(UniqueUserValidator.java(。

public class User  {
@NotNull
@UniqueUser
private String username;
@NotNull
private String password;
@NotNull
@Email
private String email;
@NotNull
private String phone;
}

UniqueUser.java

@Target({TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = UniqueUserValidator.class)
@Documented
public @interface NameMatch
{
String message() default "User id already exists";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}

UniqueUserValidator.java

public class UniqueUserValidator implements ConstraintValidator<NameMatch, Object>
{
@Autowired
UserRepository userRepository;

@Override
public boolean isValid(String userName, final ConstraintValidatorContext context)
{
boolean isValidUser = false;
if(userName!=null && !userName.isEmpty()) {
Optional<User> user= userRepository.findByUserId(userName);
isValidUser = !user.isPresent(); 
}
return isValidUser;
}
}

在上面的代码中,即使username字段为null并且显示username已经存在错误消息,也会调用该字段的唯一用户验证。我希望只有当username有一些值时才调用自定义验证器。有可能避免这个电话吗。

如果username为null,我可以通过修改下面的方法并返回true来修复错误,但我不想避免这种不必要的调用。

public class UniqueUserValidator implements ConstraintValidator<NameMatch, Object>
{
@Autowired
UserRepository userRepository;

@Override
public boolean isValid(String userName, final ConstraintValidatorContext context)
{
boolean isValidUser = false;
if(userName!=null && !userName.isEmpty()) {
Optional<User> user= userRepository.findByUserId(userName);
isValidUser = !user.isPresent(); 
} else {
isValidUser = true; 
}
return isValidUser;
}
} 

我认为您正在寻找的是分组约束;

组允许您限制在验证。验证组的一个用例是UI向导,其中每个步骤都应该只验证一个指定的约束子集。目标组作为var arg参数传递给适当的验证方法。

在您的情况下,它应该是这样的:

@GroupSequence({ FirstConstaint.class, SecondConstaint.class })
public class User  {
@NotNull(groups = FirstConstaint.class)
@UniqueUser(groups = SecondConstaint.class)
private String username;
// the rest of your fields
}
interface FirstConstaint {
}
interface SecondConstaint {
}

这样,只有当字段不为null时,它才会检查@UniqueUser,否则,它将返回@NotNull验证的消息。

否则,就像@用户说你可以在服务层使用这个检查^^

相关内容

  • 没有找到相关文章

最新更新