Как вызвать ArrayList, хранящийся в applicationScope из другого класса

Шаблоны должны использоваться в заголовках, потому что компилятор должен создавать экземпляры разных версий кода в зависимости от параметров, заданных / выведенных для параметров шаблона. Помните, что шаблон не представляет собой код напрямую, а шаблон для нескольких версий этого кода. Когда вы компилируете функцию non-template в файле .cpp, вы компилируете конкретную функцию / класс. Это не относится к шаблонам, которые могут быть созданы с использованием разных типов, а именно, если при замене параметров шаблона конкретными типами необходимо исправить конкретный код.

Была функция с ключевым словом export, которая была предназначенный для отдельной компиляции. Функция export устарела в C++11 и, AFAIK, только один компилятор реализовал ее. Вы не должны использовать export. Отдельная компиляция невозможна в C++ или C++11, но, возможно, в C++17, если понятия в нее входят, мы могли бы иметь некоторый способ отдельной компиляции.

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

Отдельная проблема компиляции для шаблонов, я думаю, это также проблема, возникающая при миграции на модули, которые в настоящее время работают.

2
задан Thomas Adrian 3 March 2019 в 19:12
поделиться

2 ответа

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

Так как вам нужен bean-объект с областью приложения внутри bean-объекта сессионной области, вы можете просто определить внедрение следующим образом:

<managed-bean>
    <managed-bean-name>Actions</managed-bean-name>
    <managed-bean-class>com.utils.actions</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
    <managed-property>
      <property-name>application</property-name>
      <value>#{App}</value>
    </managed-property>
</managed-bean>

Чтобы принять внедрение свойства внутри вашего компонента Bean-действия, определите общедоступный выполните следующие действия:

public class actions implements Serializable {

    private Application app;

    public void setApplication(Application app) {
        this.app = app;
    }

}

Таким образом, вы можете держать бин приложения в любом месте, где вам это нужно, в классе, не решая его снова и снова, когда вам это нужно. Вы также можете решить, что ссылка на компонент приложения - это слишком много, и вам просто нужны данные. В этот момент вам просто нужно настроить faces-config.xml и метод получения соответственно, чтобы получить именно это.

    <managed-property>
      <property-name>allData</property-name>
      <value>#{App.allData}</value>
    </managed-property>
public class actions implements Serializable {

    private static final long serialVersionUID = 1L;

    private ArrayList<District> allData;

    public void setAllData(ArrayList<District> allData) {
        this.allData = allData;
    }

}

Теперь два совета.

  1. Я бы не рекомендовал вам инициализировать данные компонента в конструкторе. Бины предназначены для ленивого использования, и поэтому данные должны быть лениво загружены. Если вам нужно предварительно загрузить данные, конструктор не в нужном месте. К сожалению, мы застряли с нежитью XPages, поэтому нет ничего лучше, чем исправить проблему, проверив, установлена ​​ли рассматриваемая переменная или нет. Это означает использование подхода, подобного следующему:
public class Application implements Serializable {

    private static final long serialVersionUID = 1L;

    private ArrayList<District> allData;

    //public Application(){
    //    try {
    //        getAllData();
    //    } catch (NotesException e) {
    //        e.printStackTrace();
    //    }
    //}

    public ArrayList<District> getAllData() {
        if (allData == null) {
           try {
                allData = // your logic result
            } catch (NotesException e) {
                throw new FacesException(e);
            }
        }

        return allData;
    }

}
  1. Я бы посоветовал вам использовать общепринятые соглашения об именах, которые говорят, что имена свойств должны начинаться со строчных букв (приложение вместо приложения) и имена классов с заглавными буквами (com.utils.Actions вместо com.utils.actions)
0
ответ дан shillem 3 March 2019 в 19:12
поделиться

Добавьте общедоступный метод к вашему компоненту в области приложения, который другие классы Java могут использовать для доступа к экземпляру этого компонента:

public static Application get() {
    FacesContext context = FacesContext.getCurrentInstance();
    return (Application) context.getApplication().getVariableResolver().resolveVariable("App");
}

Затем вы можете использовать этот метод для доступа к экземпляру области приложения. bean-компонент из вашего класса Actions, а затем получите доступ к методам и переменным этого bean-компонента:

public class actions {

public Vector<String> getDataForCurrentUser() {
        // Access the AL_data arraylist stored in the App application scoped bean
        ArrayList<District>  m = Application.get().AL_data;
}
0
ответ дан Per Henrik Lausten 3 March 2019 в 19:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: