Два экземпляра объекта с аннотацией @Scope(scopeName = WebApplicationContext.SCOPE_SESSION)

Мне нужна помощь в Spring @Scope(scopeName = WebApplicationContext.SCOPE_SESSION). Я создаю веб-приложение, и у меня проблема с объектом сеанса. Я создал класс:

@Component
@Scope(scopeName = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class FilterParameter {

    private LinkedHashMap<String, String> filters;

    public FilterParameter() {
        filters = new LinkedHashMap<>();
    }

    public void addFilterParameter(String filterKey, String filterValue) {
        if (filters.containsKey("byKeyword")) {
            filters.remove("byKeyword");
        }
        filters.put(filterKey, filterValue);
    }

    public void addKeyWord(String filterValue) {
        if (!filters.isEmpty()) {
            filters.clear();
        }
        filters.put("byKeyword", filterValue);
    }

    public void removeFilterParameters(boolean allParam, String filterKey) {
        if (allParam) {
            filters.clear();
        } else {
            filters.remove(filterKey);
        }
    }

    public LinkedHashMap<String, String> getFiltersList() {
        return filters;
    }
}

Я реализовал это как поле в одном из контроллеров.

@Controller
public class AssessmentController {

 private FilterParameter filterA;

  public AssessmentController(FilterParameter filterA){

        this.filterA = filterA;
  }

//...
}

И мне нужно использовать его в другом контроллере как независимый фильтр:

@Controller
public class ProcessController {

 private FilterParameter filterB;

  public ProcessController(FilterParameter filterB){

        this.filterB = filterB;
  }

//...
}

Spring создает singleton FilterParameter для обоих контроллеров. Как я могу настроить его для создания независимого экземпляра FilterParameter?

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

JB Nizet 24.03.2019 00:06

Как вы определяете bean-компонент на основе Параметр фильтра? Почему вы не показываете это в своем примере? Без этого дополнительного кода здесь не произошло бы никакой инъекции.

CryptoFool 24.03.2019 00:12

Как вы определяете свой Контекст приложения? Bean-компоненты с областью сеанса включают объект Сессия, привязанный к Контекст приложения. Если вы настроили все это правильно, вы должны получать bean-компоненты для каждого сеанса, внедряемые в ваши контроллеры. - Это может быть так же просто, как добавить аннотацию @Scope("сеанс") к вашему классу Параметр фильтра, но это может зависеть и от других вещей. Вы пробовали это? Вы делаете это и все равно получаете синглтоны? Я думаю, это то, что вы подразумеваете, но я просто предполагаю.

CryptoFool 24.03.2019 00:20

Кроме того, для каждого сеанса не означает для каждого контроллера. С одним контроллером Spring будет подключать разные bean-компоненты, уникальные для каждого пользователя/сеанса, использующего ваш сайт. Поэтому, если вы говорите об одном и том же пользовательском сеансе, использующем оба контроллера, вы хотите, чтобы Spring внедрил один и тот же компонент в оба контроллера. Это, опять же, то, почему это больше зависит от того, как настроен ваш контекст (веб-приложения) и какие детали того, как ваши конечные точки вызываются, будут определять, какие копии bean-компонентов будут внедрены в ваши контроллеры.

CryptoFool 24.03.2019 00:30

Вот хороший минимальный пример: Logicbig.com/tutorials/spring-framework/spring-web-mvc/…

CryptoFool 24.03.2019 00:41

Я использую Spring Boot, поэтому я не определял отдельный класс конфигурации: } }

Jack 24.03.2019 11:50

Назначение этого фильтра (FilterParameter) состоит в том, чтобы отфильтровать массив объекта оценки (класс Assessment) и массив объекта процесса (класс Process). Каждый из этих обоих объектов имеет свой собственный контроллер. И эти оба объекта должны иметь свой собственный FilterParameter для фильтрации объекта. HashMap (из FilterParameter) используется для создания динамического SQL-запроса для получения отфильтрованного списка этих объектов (оценка и процесс).

Jack 24.03.2019 11:51
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
180
0

Другие вопросы по теме