#java #spring #spring-mvc #spring-aop
#java #весна #spring-mvc #spring-aop
Вопрос:
Я пытаюсь внедрить компонент InputForm с сессионной областью в контроллер с одноэлементной областью, но вместо этого компонент InputForm получает одноэлементную область. Любая помощь приветствуется.
@Controller
@RequestMapping("/app")
public class MyAppController {
// AOP session scoped proxy type CGLIB
@Autowired private InputForm inputForm;
@RequestMapping(value = "/home", method = RequestMethod.GET)
public ModelAndView returnHome() {
Map<String, Object> modelMap = new HashMap<String, Object>();
modelMap.put("inputForm", inputForm);
return new ModelAndView("homePage", modelMap);
}
@RequestMapping(value = "/process", method = RequestMethod.POST)
public ModelAndView processData(@ModelAttribute("inputFormAttr")
InputForm inputFormBinding) {
// inputFormBinding is the data bound from inputs in jsp page.
this.inputForm = inputFormBinding;
}
<bean id="inputForm" class="<package>.InputForm"
scope="session" init-method="init">
<property name="id" value="${property_id}"/>
<property name="name" value="${property_name}"/>
<property name="phoneNo" value="${property_phone}"/>
<aop:scoped-proxy proxy-target-class="true"/>
</bean>
Комментарии:
1. Как вы можете определить, что это одноэлементный?
2. Как вы загружаете
Controller
класс?3.
<context:annotation-config />
@Sotirios: Область действия по умолчанию — singleton, верно?4. Да, по умолчанию используется одноэлементный. Но вы не использовали область по умолчанию. Вы использовали
session
.5. Извините, я имел в виду, что контроллер находится в одноэлементном, а не в введенном компоненте
Ответ №1:
То, что вы делаете, прекрасно. Spring введет прокси-сервер в цель внедрения
@Autowired private InputForm inputForm;
Но когда вы вызываете методы для этого объекта, прокси-сервер делегирует объект, который будет храниться в HttpSession
.
Обратите внимание, что каждый из целевых компонентов будет иметь одинаковые свойства, установленные через ваши заполнители свойств
<property name="id" value="${property_id}"/>
Это может ввести вас в заблуждение при отладке, но у компонента есть область сеанса.
Комментарии:
1. Но тогда как я могу получить свойства в области сеанса?
2. @User49234123412341 Вы устанавливаете свойства всех объектов, созданных на основе этого определения компонента, в одно и то же значение. Если вы измените один в одном сеансе, это не повлияет на другой в другом сеансе.
3. Но это моя проблема. Я открыл приложение на другом компьютере, и они видят те же свойства в InputForm, что и на первом компьютере. Как вы можете видеть, запрос get просто получает прокси и устанавливает в карту модели
4. @User49234123412341 Вы изменили значения свойств на любом из компьютеров?
5. Все, что изменяется на первом компьютере с помощью запроса post другого контроллера, отображается на втором компьютере при вызове запроса get