Spring 自定义验证注解因为空指针异常不工作?

问题描述 投票:0回答:1

我有这个自定义注释界面:

@Documented
@Constraint(validatedBy = NameValidator.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface NameValidation {

    String message() default "Name invalid";

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

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

有这个 NameValidator 类:

public class NameValidator implements ConstraintValidator<NameValidation, String> {

    @Autowired
    private NicknameRepository nicknameRepository;

    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        return nicknameRepository.existsById(1L);
    }
}

NameValidator 需要一个自动装配的存储库对象来测试数据库中的值。

昵称库

@Repository
public interface NicknameRepository extends JpaRepository<Nickname, Long> {

}

自定义注解的实体与使用:

@Entity
@Getter
@Setter
@NoArgsConstructor
@Table(name = "Nickname")
@ToString
public class Nickname extends RepresentationModel<Nickname> {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;

    @Column(name = "nicknameValue")
    private String nicknameValue;

    @Column(name = "byUser")
    @NameValidation(message = "Name is invalid")   // using custom annotation
    private String byUser;

}

当我运行应用程序并尝试添加新的昵称时,出现错误。 NameValidator 类中的昵称存储库为空。

这是我得到的错误。

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: jakarta.validation.ValidationException: HV000028: Unexpected exception during isValid call.] with root cause

java.lang.NullPointerException: Cannot invoke "com.proj.repository.NicknameRepository.existsById(Object)" because "this.nicknameRepository" is null

我已经在 stackoverflow 上尝试了许多不同的答案,例如将 @Service/@Component 添加到 NameValidator 等,但出于某种原因,Spring 仍然没有自动装配昵称存储库。 在其他类中自动装配昵称存储库似乎工作正常。

java spring validation spring-annotations spring-validator
1个回答
0
投票

你试过添加这个配置bean吗?

@Configuration
public class ValidationConfig {
    @Bean
    public Validator validator () {
      return new LocalValidatorFactoryBean();
    }

    @Bean
    public MethodValidationPostProcessor     methodValidationPostProcessor() {
      MethodValidationPostProcessor  methodValidationPostProcessor = new      MethodValidationPostProcessor();
      methodValidationPostProcessor.setValidator(validator());

      return methodValidationPostProcessor;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.