我尝试在 Spring Boot 框架中创建带有约束验证器的自定义注释,但在执行自定义验证器时收到注入服务为空的错误。
而且,我已经检查了之前与此相关的答案。但是,现在任何答案对我都不起作用。
其中一些如下,
javax.validation.ValidationException:HV000064:无法实例化ConstraintValidator
http://dolszewski.com/spring/custom-validation-annotation-in-spring/
我的自定义注释和约束验证器如下,
自定义注释
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Constraint(validatedBy = UniqueFoodNameValidator.class)
public @interface UniqueFoodName {
String message() default "{UniqueFoodName}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
自定义约束验证器
public class UniqueFoodNameValidator implements ConstraintValidator<UniqueFoodName, String> {
private FoodService foodService;
@Autowired
public UniqueFoodNameValidator(FoodService foodService) {
this.foodService = foodService;
}
@Override
public void initialize(UniqueFoodName constraintAnnotation) {
}
@Override
public boolean isValid(String foodName, ConstraintValidatorContext context) {
return Objects.isNull(foodName) || foodService.get(foodName).isEmpty();
}
}
所以,如果有人云帮助我找出问题并解决这个问题,我将非常感激。
注意: FoodService 是一个接口,其方法在 FoodServiceImpl 类中实现。
回答有点晚了,但希望对某人有用。
我认为问题出在您的 Hibernate 配置中。问题是您要验证该字段两次。发生这种情况是因为 Spring 和 Hibernate 都会自动运行验证。
如果您调试
isValid
方法,您将看到第一次注入 FoodService
时流程会两次进入该方法,但第二次则不会。
要修复它,您可以禁用 Hibernate 自动验证。例如:
private Properties hibernateSettings() {
Properties settings = new Properties();
// some settings
settings.put("javax.persistence.validation.mode", "none");
return settings;
}
@Bean
public LocalSessionFactoryBean getSessionFactory() {
LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource());
sessionFactoryBean.setHibernateProperties(hibernateSettings());
sessionFactoryBean.setPackagesToScan("com.springmvc.models");
return sessionFactoryBean;
}