簡體   English   中英

Spring自定義驗證器注入NullPointerException

[英]Spring Custom Validator Injection NullPointerException

嘗試使用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 {};
}

還有自定義驗證器:

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")); ,我得到了一個NullPointerException上注入userRepositoryUniqueLoginValidator

我認為Spring可以正確注入自定義驗證器,我必須告訴他。 但是,我不知道如何。 我已經嘗試過通過Stack Overflow和Google找到的一些東西,但是沒有運氣。

任何幫助將不勝感激。

經過幾次搜索和討論之后,將bean注入Bean Validation Constraint似乎不是一個好習慣。

這就是為什么Hibernate上下文不了解Spring上下文的原因。

我有類似的問題, 但是我能夠在自定義驗證器中注入Spring Bean

Spring框架自動檢測實現ConstraintValidator接口的所有類,實例化它們,並連接所有依賴項。

我正在使用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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM