java - Spring自定义 validator 注入(inject)NullPointerException

标签 java spring validation

我在尝试使用 Spring 定义自定义约束验证时遇到问题。

我的代码可以在我的 GitHub 上找到.

问题来了。我有一个在登录时具有验证约束的实体:

@Entity
public class User {

  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  private Long id;

  @UniqueLogin
  private String login;
  [...]
}

这是注释定义:

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = UniqueLoginValidator.class)
public @interface UniqueLogin {
  String message() default "{loginIsNotUnique}";
  Class<?>[] groups() default {};
  Class<? extends Payload>[] payload() default {};
}

还有自定义 validator :

public class UniqueLoginValidator implements ConstraintValidator<UniqueLogin, String> {

   @Autowired
   private UserRepository userRepository;

   public boolean isValid(String login, ConstraintValidatorContext context) {
      return userRepository.countByLogin(login) == 0;
   }
}

当我调用 repository.save(new User("Kim")); 时,我在 UniqueLoginValidator 的注入(inject) userRepository 上遇到了 NullPointerException

我认为 Spring 能够正确注入(inject)自定义 validator ,我必须告诉他。但是,我不知道怎么办。我已经尝试过通过 Stack Overflow 和 Google 找到的一些东西,但没有成功。

任何帮助将不胜感激。

最佳答案

我遇到了类似的问题,但我能够在自定义 validator 中注入(inject) Spring Bean

Spring 框架自动检测所有实现 ConstraintValidator 接口(interface)的类,实例化它们,并连接所有依赖项。

我正在使用 Spring Boot 2.0。 注意 UniqueFieldValidator 未使用任何 spring bean 注释进行注释

示例代码

public class UniqueFieldValidator implements ConstraintValidator<UniqueField, Person> {

    @Autowired
    PersionList personRepository;


    @Override
    public boolean isValid(Person object, ConstraintValidatorContext context) {
        log.info("Validating Person for Duplicate {}",object);
        return personRepository.isPresent(object);
    }

} 

@Documented
@Constraint(validatedBy = UniqueFieldValidator.class)
@Target({ ElementType.METHOD,ElementType.ANNOTATION_TYPE,ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface UniqueField {

    String message() default "Duplicate Name";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

使用

@Component
@Validated
public class PersonService {

    @Autowired
    PersionList personRepository;

    public void addPerson(@UniqueField Person person) {
        personRepository.add(person);
    }
}

关于java - Spring自定义 validator 注入(inject)NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48258441/

相关文章:

不会取代 javascript 的 java 框架

javascript - 表单提交时出现 JQuery RangeError

JavaFX 自定义对话框未居中

java - 检查 Drools 列表中的特定元素

java - TableLayout 中的 ImageView

java - 如果没有从 FTP 提取文件,则发送电子邮件通知

spring - Spring Boot自定义连接对象

forms - ng-submit 不会阻止提交

javascript - jQuery 表单验证仅在特定输入上失败

java - 在android中分割音频文件