Можно ли установить аннотацию @Qualifier к закрытой статической переменной в классе Java? - PullRequest
0 голосов
/ 01 января 2019

В настоящее время я использую шаблоны JDBC для извлечения данных из базы данных.Для этого я создал «статический» класс репозитория (т. Е. Класс, помеченный как «конечный» и с одним закрытым конструктором).В нем я пытаюсь установить значения двух закрытых статических переменных класса PlatformTransactionManager.

Однако мой IntelliJ говорит мне, что значения переменных класса всегда равны нулю, и я понятия не имею, какрешить эту проблему.

Я надеялся просто использовать их в качестве локальных переменных в статическом конструкторе, поскольку мне действительно нужны константы JdbcTemplate, которые я подготовлю с использованием PTM.Поскольку я не знаю, как это сделать, я попытался сделать их в private static final полях.Но IntelliJ этого тоже не допустил.

Чтобы попытаться решить эту проблему, я рассмотрел следующие темы:

.,,а также это примечание по классификаторам:

Важные примечания:

  • В проекте, над которым я работаю, нет файлов конфигурации XML.В проекте есть [*] файлы конфигурации, которые обрабатывают конфигурации.
  • Еще одна вещь, на которую следует обратить внимание, это то, что я не совсем понимаю аннотации в целом (будь то в Java, C # и т. Д.).То есть я знаю основную идею, стоящую за ними, но я понятия не имею, как они на самом деле работают.,,и я больше не помню большую часть среды Spring (поскольку я работаю над Core Java и C # .NET уже довольно давно).Так .,,Буду признателен за помощь в решении этой проблемы.

Ниже приведен пример того, как выглядит мой исходный код:

private final class Repository {

  private Repository() {}

  private static final JdbcTemplate TEMPLATE1;
  private static final JdbcTemplate TEMPLATE2;

  @Qualifier( "transactionManager1" )
  private static PlatformTransactionManager manager1;

  @Qualifier( "transactionManager2" )
  private static PlatformTransactionManager manager2;

  static {
    // NOTE: For this one, IntelliJ shows me an error stating, "Value 'manager1'
    // is always 'null'."
    DataSource source =
      ( ( JpaTransactionManager ) manager1 ).getDataSource();

    TEMPLATE1 = new JdbcTemplate( source );

    // NOTE: Here, there is no error ... at least, IntelliJ isn't showing any.
    source = ( ( JpaTransactionManager ) manager2 ).getDataSource();

    TEMPLATE2 = new JdbcTemplate( source );
  }

  public Map<String, Object> fetchData() {
    return TEMPLATE1.queryForList( "..." ); // TODO: something
  }

}

1 Ответ

0 голосов
/ 01 января 2019

Вы можете реализовать интерфейс ApplicationContextAware для получения объекта контекста, и используя этот объект контекста, вы можете получить компонент даже в статическом контексте.

public class ApplicationBeansProvider implments ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        this.applicationContext = applicationContext;
    }

    public static Object getBean(String beanName) {
        return applicationContext.getBean(beanName);
    }
}

, а затем в своем коде вы можете сделать что-то вроде

private final class Repository {

  private Repository() {}

  private static final JdbcTemplate TEMPLATE;

  private static PlatformTransactionManager manager = ApplicationBeansProvider.getBean("transactionManager");


  static {
    DataSource source =
      ( ( JpaTransactionManager ) manager ).getDataSource();

    TEMPLATE = new JdbcTemplate( source );

  }

  public Map<String, Object> fetchData() {
    return TEMPLATE1.queryForList( "..." ); // TODO: something
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...