【发布时间】:2020-07-19 20:13:36
【问题描述】:
我正在开发 Spring Boot 应用程序中的 javax 验证 API。我有一个用户 bean,我必须验证请求中给出的用户名是唯一的,并且不存在于数据库中。
我为此要求创建了自定义注释 (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 isUserExist = false;
if(userName!=null && !userName.isEmpty()) {
Optional<Product> product = userRepository.findByUserId(userName);
isUserExist = product.isPresent();
}
return isUserExist;
}
}
我正在使用 Spring Data JPA 编写 Repository 类并从 DB 中获取用户名。
UserRepository.java:
import org.springframework.data.repository.CrudRepository;
@Repository
interface UserRepository extends CrudRepository<User, Long> {
Optional<User> findByUserId();
}
ValidationConfig.java
@Bean
public Validator validator (final AutowireCapableBeanFactory autowireCapableBeanFactory) {
ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
.configure().constraintValidatorFactory(new SpringConstraintValidatorFactory(autowireCapableBeanFactory))
.buildValidatorFactory();
Validator validator = validatorFactory.getValidator();
return validator;
}
UserNameValidationTest.java
public class UserNameValidationTest
{
@Autowired
Validator validator;
@Test
public void whenExistingUser_thenFai()
{
User user = new User();
user.setUserName("testUSer"); //Existing user is set
user.setPhone("12345678");
user.setPassword("password123");
user.setEmail("test@gmail.com");
//Validate bean
Set<ConstraintViolation<User>> constraintViolations = validator.validate(user);
//Show errors
if (constraintViolations.size() > 0) {
for (ConstraintViolation<User> violation : constraintViolations) {
System.out.println(violation.getMessage());
}
} else {
System.out.println("Valid Object");
}
assertsEquals(true, constraintViolations.size()>0);
}
}
在执行上述测试类时,我得到 NullPointerException,因为 userRepository 在自定义验证器类中是 null。有人可以帮我解决这个问题吗?
【问题讨论】:
-
删除你的
validator方法(Spring 已经完成了所有这些以及更多开箱即用的操作,并确保你的测试用例使用正确的配置(因为配置太少,无法判断)有关正在运行的完整测试的信息)。 -
@user3244519 请查看答案,希望对您有所帮助
标签: java spring validation junit hibernate-validator