当前位置: 首页 > 知识库问答 >
问题:

Spring自定义验证器注入NullPointerException

方飞鸣
2023-03-14
@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”));时,我在插入的uniqueloginvalidatoruserrepository上得到了一个NullPointerException

我假设Spring会正确地注入定制验证器,我必须告诉他。但是,我不知道怎么做。我已经尝试了一些通过堆栈溢出和谷歌找到的东西,但没有运气。

任何帮助都将不胜感激。

共有1个答案

袁英豪
2023-03-14

我也有类似的问题,但我能够在自定义验证器中注入Spring Bean。

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

我使用的是Spring Boot2.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);
    }
}
 类似资料:
  • 我试图用Hibernate Validation 6.0.1定义约束定义,其中验证器位于相对于约束注释的不同位置(.jar/项目)。Aka,我有我想要验证的对象,它们位于带有注释定义的项目“api”中,但我将在项目“modules/common”中有验证器 我遵循文档中的描述。 配置文件 约束注释 验证器 我的问题我的问题是,如果我没有将“@约束(validatedby={})”放在注释中,我会得

  • 我正在开发spring mvc应用程序,我应该在spring mvc validator的基础上应用验证。第一步,我为类和设置控制器添加了注释,效果很好。现在我需要实现自定义验证器来执行复杂的逻辑,但我想使用现有的注释并添加额外的检查。 我的用户类: 我的验证器: 我的控制器: 那么,有可能同时使用自定义验证器和注释吗?如果是,怎么做?

  • 我创建了一个自定义验证属性,我想将其用于 API 控制器 DTO。此属性需要来自已配置选项的值,这就是我在构造函数中注入这些值的原因,以便我以后可以在 和 方法中使用选项服务。 不幸的是,当我想在DTO中将其用作属性时 我收到错误信息 没有给出对应于'MyValidationAttribute.MyValidationAttribute(IOptionsMonitor)'所需形式参数'myOpti

  • 我使用Spring MVC和Hibernate来开发一个Web应用程序。起初,我只使用标准的JSR303注释。然后,我决定使用一些自定义注释来验证一个新用户的用户名和电子邮件的唯一性,该用户希望创建一个帐户。 因此,我创建了两个注释,如下所示(一个用于电子邮件,另一个用于用户名):

  • 我正在开发一个java spring mvc应用程序。我已经实现了一个自定义的验证注释来验证某些字符串(例如)。这是我的注释体: 这是我的类:

  • 问题内容: 我想自定义弹簧验证错误 但是我做不到。要采取的步骤是什么? 问题答案: 该JSR 303的默认邮件插补算法,您可以通过提供捆绑命名的资源来定制信息。在类路径中创建一个文件,其中包含: 这将更改@Size约束的默认消息,因此您应该使用@Size约束而不是特定于Hibernate的@Length约束。 您可以更改特定约束实例的消息,而不是更改所有约束的默认消息。message在约束上设置属