Как выполнить пользовательскую проверку объекта для многопользовательской настройки с использованием Spring Hibernate

#spring-boot #hibernate #spring-data-jpa #multi-tenant #bean-validation

#spring-boot #спящий режим #spring-data-jpa #многопользовательский #bean-проверка

Вопрос:

Я пытаюсь проверить поле объекта, используя пользовательскую реализацию ConstraintValidator в многопользовательской настройке с использованием spring hibernate. Как мы можем уведомить пользователя пользовательского валидатора? Диспетчер объектов и другие автоматически подключаемые компоненты в валидаторе всегда равны нулю.

Класс объекта:

 @Entity
@Table(name = "autoupdate_json")
public class AutoupdateJson {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@Column(name="autoupdate_id")
private String autoupdateId; 

@Column(name="deployment_json", length=10000)
@ValidateAutodeploymentConfig
@Convert(converter=JpaConverterJson.class)
private ApplyInputJson deploymentJson; 
}
 

`
Аннотация проверки:

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

String message() default "One or More of the Devices already have perpetual mode settings enabled. Please cancel the existing "
          " deployment config to add a new one, Updates are not supported. ";

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

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

Реализация валидатора:

 public class AutodeploymentConfigValidator
    implements ConstraintValidator<ValidateAutodeploymentConfig, ApplyInputJson> {

@PersistenceContext
EntityManager entityManager; 

@Autowired
DeviceRepository deviceRepository; 

@Override
public boolean isValid(ApplyInputJson value, ConstraintValidatorContext context) {
    List<String> deviceSerialNumbers = Arrays.asList(value.getDevices().getSerial());
    
    System.out.println("entityManager: "   entityManager);
    System.out.println("repo bean: "   deviceRepository);
}
 

Оба системных вывода имеют значение null.

Ответ №1:

Диспетчер объектов и репозиторий устройств имеют значение null, поскольку AutodeploymentConfigValidator они не поступают из контекста spring. Он создается с помощью фабрики проверки ограничений по умолчанию, используемой hibernate, которая не использует конструктор arg.

Попробуйте добавить HibernatePropertiesCustomizer , чтобы указать hibernate, какую фабрику проверки использовать. Что-то вроде:

 @Component
public class HibernateCustomizer implements HibernatePropertiesCustomizer {

    private final ValidatorFactory validatorFactory;

    public HibernateCustomizer(ValidatorFactory validatorFactory) {
        this.validatorFactory = validatorFactory;
    }

    public void customize(Map<String, Object> hibernateProperties) {
        hibernateProperties.put("javax.persistence.validation.factory", validatorFactory);
    }
}
 

При этом вы должны иметь возможность использовать entity manager в вашем средстве проверки ограничений.