Spring @Conditional на основе значения в таблице базы данных - PullRequest
0 голосов
/ 01 мая 2020

Оценка состояния зависит от значения, указанного в таблице базы данных.

@Component
public class XYZCondition implements Condition{

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
              //based on value defined in DB should return true/false
    }

}

Поскольку условие выполняется очень рано, невозможно получить значение в БД. Есть ли альтернативный способ добиться этого?

Ответы [ 3 ]

0 голосов
/ 01 мая 2020

Значения базы данных могут быть изменены во время работы приложения, хотя перезагрузка контекста приложения не кажется хорошей идеей. Поэтому я бы рекомендовал использовать свойства конфигурации, чтобы выбрать, какие компоненты должны быть доступны в контексте.

Кроме того, существует Spring Cloud Config, который позволяет вам сохранять конфигурацию в git или некоторых других хранилищах. Его потребители могут перезапустить контекст после изменения конфигурации. Кажется, стоит на это взглянуть.

0 голосов
/ 01 мая 2020

Что ж, вы пытаетесь сделать что-то, что не подходит для весенней загрузки в этой форме.

Я предлагаю немного изменить требование:

Вместо попытки доступа базу данных в пользовательском условии, создайте пользовательский источник конфигурации и загрузите свойство из базы данных в среду, чтобы при последующей оценке условий во время процесса запуска свойство со связанным значением (ранее разрешалось из базы данных) уже доступен.

Примеры следующего такого подхода: - конфигурация Spring boot cloud, которая считывает свойства конфигурации из «удаленной» службы конфигурации (через REST);

Этот подход гораздо более дружественный к весне, и также может спасти приложение от многократного вызова базы данных (что, если у вас есть 100 bean-компонентов с этим пользовательским условным условием) - будет ли оно выполнять 100 запросов?

Теперь это, вероятно, будет означать, что вам не понадобится пользовательское условие - возможно, оно будет @Condition для свойства.

Другое предостережение: вы не сможете использовать JPA / Spring Data для загрузки этого свойства, вероятно, вам придется go с простым JDB C здесь.

0 голосов
/ 01 мая 2020

Хм, может быть, вы можете просто создать класс конфигурации и добавить свой репозиторий, а затем создать бин. Затем внутри метода bean-компонента извлекают значение из базы данных и возвращают условный экземпляр. как то так

@Configuration
public class Config {

@Autowired  
private Repository repository;

@Bean
public Interface interface(){
  boolean val = reposiory.getDBValue();
  if(val)
    return new Impl1();
  else
    return new Impl2();
  }
}
...