2016-06-04 3 views
0


Это может быть глупый вопрос, но я просто смущен. У меня есть контроллер, где создается объект & Я хочу использовать этот объект в нескольких других контроллерах.
В настоящее время мой объект является переменной класса, которая переписывается при выполнении другого запроса пользователя или сеанса, я уверен, что это не так. & создаст проблему с сеансом. Давайте предположим, что ниже мой сценарий:
Использование объекта в разных контроллерах

@Controller 
    public class DemoController 
    { 
     /* CURRENTLY THIS IS WHAT I'M DOING BUT I DON'T WANT THIS VARIABLE GLOBAL*/ 
     private MyCommonObject myCommonObject = new MyCommonObject(); 


     @RequestMapping(value="/demo-one", method=RequestMethod.POST) 
     public ModelAndView postControllerOne(@ModelAttribute SearchForm searchForm, 
       ModelMap modelMap) 
     { 
      //I want to use this object in all other controllers too 
      myCommonObject = someMethodToGetApiResult(searchForm); 

      SomeOtherObject someOtherObject = getSomeObject(myCommonObject); 
      modelMap.addAttribute("someOtherObject",someOtherObject); 

      return new ModelAndView("/firstJSP"); 
     } 

     @RequestMapping(value="/demo-two", method=RequestMethod.POST) 
     public ModelAndView postControllerTwo(@ModelAttribute SomeForm someForm, 
       ModelMap modelMap) 
     { 
      // Used the class variable here 
      SomeOtherObject someOtherObject = getSomeObject(myCommonObject,someForm); 

      modelMap.addAttribute("someOtherObject",someOtherObject); 
      return new ModelAndView("/secondJSP"); 
     } 

     @RequestMapping(value="/demo-three", method=RequestMethod.POST) 
     public ModelAndView postControllerThree(@ModelAttribute SomeForm someForm, 
       ModelMap modelMap) 
     { 
      // Used the class variable here 
      SomeOtherObject someOtherObject = getSomeObject(myCommonObject,someForm); 

      modelMap.addAttribute("someOtherObject",someOtherObject); 
      return new ModelAndView("/thirdJSP"); 
     } 

     @RequestMapping(value="/demo-four", method=RequestMethod.POST) 
     public ModelAndView postControllerFour(@ModelAttribute SomeForm someForm, 
       ModelMap modelMap) 
     { 
      // Used the class variable here 
      SomeOtherObject someOtherObject = getSomeObject(myCommonObject,someForm); 

      modelMap.addAttribute("someOtherObject",someOtherObject); 
      return new ModelAndView("/fourthJSP"); 
     } 
    } 

Спасибо.

+0

Если вы исправите свои отступы, чтобы сделать код удобным для чтения, я мог бы действительно посмотреть на код. – Andreas

+0

@ Андреас Сделал это. Написал этот код в редакторе стека, а не на какой-то IDE, так что .. Хорошо, я был бы счастлив, если бы получил решение. – Yadvendra

ответ

1

DemoController является singleton. Существует только один экземпляр для всех веб-запросов.

Это означает, что во всем webapp имеется только одно значение myCommonObject. Тот, кто бьет /demo-one последний выигрывает, и все хиты на /demo-two до /demo-four будут использовать последний экземпляр, независимо от того, кто это делает.

Я предполагаю, что MyCommonObject хранит информацию о состоянии, иначе зачем делать то, что вы пытаетесь сделать. Этот объект состояния сбрасывается каждый раз любой просмотров /demo-one. Не могу этого сделать. Короче говоря, не сохраняйте состояние в контроллере.

Поскольку вы хотите экземпляр MyCommonObject для каждого клиента, сохраните его в HttpSession.

+0

На самом деле я создаю веб-приложение для бронирования рейсов. В первом контроллере я получаю ответ от API любого поиска. Мне нужен этот объект ответа для следующих 3 шагов, например, ценообразование, резервирование и продажа билетов. Это правда, что я могу хранить объект в сеансе (хотя объект ответа слишком тяжелый), но что делать, если пользователь входит в систему из двух разных систем? Последний поиск сохраняется в этом случае. – Yadvendra

+0

Затем вам нужно сохранить неполное бронирование на глобальной карте с помощью идентификатора пользователя. Карта может находиться в статическом поле, поле экземпляра одноэлементного (например, ваш контроллер) или в атрибуте приложения сервлета. Вы также можете рассмотреть возможность их хранения в базе данных, чтобы они сохранялись через перезагрузки сервера webapp и делились, если вы кластерируете ваш (очень популярный) webapp. Необходима соответствующая логика для очистки устаревших заказов. – Andreas

1

Если вы используете централизованный сервер, чем объявляете класс как @Component и как singleton и инициализируете свой объект один раз.

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

0

Если вы хотите использовать myCommonObject в нескольких Controllers, и если этот объект имеет состояние, которое не является конкретным для пользователя (т. Е. Область действия является полным веб-приложением), вы можете определить его как компонент в контексте весеннего приложения (XML или Java, а также с областью действия Singleton) и использовать ее любой Controller, который вы хотите.