我有这个自定义注释界面:
@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 仍然没有自动装配昵称存储库。 在其他类中自动装配昵称存储库似乎工作正常。
你试过添加这个配置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;
}
}