Мне нужна помощь в 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?
Как вы определяете bean-компонент на основе Параметр фильтра? Почему вы не показываете это в своем примере? Без этого дополнительного кода здесь не произошло бы никакой инъекции.
Как вы определяете свой Контекст приложения? Bean-компоненты с областью сеанса включают объект Сессия, привязанный к Контекст приложения. Если вы настроили все это правильно, вы должны получать bean-компоненты для каждого сеанса, внедряемые в ваши контроллеры. - Это может быть так же просто, как добавить аннотацию @Scope("сеанс") к вашему классу Параметр фильтра, но это может зависеть и от других вещей. Вы пробовали это? Вы делаете это и все равно получаете синглтоны? Я думаю, это то, что вы подразумеваете, но я просто предполагаю.
Кроме того, для каждого сеанса не означает для каждого контроллера. С одним контроллером Spring будет подключать разные bean-компоненты, уникальные для каждого пользователя/сеанса, использующего ваш сайт. Поэтому, если вы говорите об одном и том же пользовательском сеансе, использующем оба контроллера, вы хотите, чтобы Spring внедрил один и тот же компонент в оба контроллера. Это, опять же, то, почему это больше зависит от того, как настроен ваш контекст (веб-приложения) и какие детали того, как ваши конечные точки вызываются, будут определять, какие копии bean-компонентов будут внедрены в ваши контроллеры.
Вот хороший минимальный пример: Logicbig.com/tutorials/spring-framework/spring-web-mvc/…
Я использую Spring Boot, поэтому я не определял отдельный класс конфигурации: } }
Назначение этого фильтра (FilterParameter) состоит в том, чтобы отфильтровать массив объекта оценки (класс Assessment) и массив объекта процесса (класс Process). Каждый из этих обоих объектов имеет свой собственный контроллер. И эти оба объекта должны иметь свой собственный FilterParameter для фильтрации объекта. HashMap (из FilterParameter) используется для создания динамического SQL-запроса для получения отфильтрованного списка этих объектов (оценка и процесс).




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