我正在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验证的消息。
否则,就像@用户说你可以在服务层使用这个检查^^