注入的服务在自定义约束验证器中变为空

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

我尝试在 Spring Boot 框架中创建带有约束验证器的自定义注释,但在执行自定义验证器时收到注入服务为空的错误。

而且,我已经检查了之前与此相关的答案。但是,现在任何答案对我都不起作用。

其中一些如下,

javax.validation.ValidationException:HV000064:无法实例化ConstraintValidator

Autowired 在自定义约束验证器中给出 Null 值

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 类中实现。

java spring-boot
2个回答
0
投票

回答有点晚了,但希望对某人有用。

我认为问题出在您的 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;
}

0
投票

尝试将注入 FoodService 作为最后一个字段;这段代码运行良好,所以看看吧。

enter image description here

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.