#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 в вашем средстве проверки ограничений.