2017-03-13 47 views
1

我正在開發使用Spring的應用程序,我需要在會話中初始化Ticket對象,然後從另一個控制器獲取它。Spring @Autowired給出了新實例,而不是初始化會話scoped bean

我有兩個控制器,所以有兩個xml上下文。

的web.xml

<web-app id="WebApp_ID" version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 

    <display-name>Spring Web MVC Application</display-name> 

    <welcome-file-list> 
     <welcome-file>index.html</welcome-file> 
    </welcome-file-list> 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring-context.xml</param-value> 
    </context-param> 

    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <servlet> 
     <servlet-name>rest</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/rest-context.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>rest</servlet-name> 
     <url-pattern>/rest/*</url-pattern> 
    </servlet-mapping> 

    <servlet> 
     <servlet-name>index</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/index-context.xml</param-value> 
     </init-param> 
     <load-on-startup>2</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>index</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

其餘-context.xml中

<beans ...> 
    <mvc:annotation-driven/>  
    <context:annotation-config/>  
    <context:component-scan base-package="menu.MenuController"/>  
</beans> 

索引的context.xml

<beans ...> 
    <mvc:annotation-driven/> 
    <mvc:resources mapping="/**" location="/"/> 

    <context:annotation-config/>  
    <bean class="auth.IndexWebController" />  
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/> 
</beans> 

在彈簧方面我有我的票豆:

<bean id="tickerProvider" class="TicketProviderImpl" scope="session"> 
    <aop:scoped-proxy/> 
與其他豆類

在一起。

這是什麼我的控制器看起來像:

IndexWebController.java

@Controller 
@SessionAttributes("user") 
public class IndexWebController { 

    private static Logger logger = LoggerFactory.getLogger(IndexWebController.class); 

    @Autowired 
    private TicketProviderImpl ticketProvider; 

    @ModelAttribute("user") 
    public User populateUser() { 
     return new User(); 
    } 

    @RequestMapping(value = "/", method = {RequestMethod.POST, RequestMethod.GET}) 
    public ModelAndView printIndex(@ModelAttribute("user") User user, 
            @RequestParam(value = "iv-user", required = false) String login, 
            @RequestParam(value = "iv-groups", required = false) String groups) { 
     ModelAndView modelAndView = new ModelAndView(); 
      modelAndView.setViewName("index.html"); 

<...>    
     ticketProvider.setLogin(login); 
       logger.info("Пользователь установлен в " + login); 
    <...> 

MenuController.java

@Controller 
public class MenuController { 

    @Autowired 
    private TicketProviderImpl ticketProvider; 

    @ResponseBody 
    @RequestMapping("/getMenuList") 
    public MenuListDTO getMenuList(


      @RequestParam(value = "menuId", required = true, defaultValue = "-1") long menuId, 
       @RequestParam(value = "parentId", required = true, defaultValue = "0") long parentId) { 

<...> 
      System.out.println(ticketProvider.getLogin()); 
<...> 

     } 
    } 

問題是當我在MenuController中自動裝入ticketProvider bean時,我得到它的一個新實例,而不是那些已經在IndexWebController中初始化的實例。其實我得到空,但等待登錄。

使用會話作用域bean的錯誤或誤解在哪裏?

回答

-1

根據this您將需要另一個偵聽器將您的會話公開給應用程序。 因此,加入<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>應該做的伎倆。

+0

我在想,你解決了這個問題嗎?我的答案被降低了,我很好奇,爲什麼? @Andrey Z. – rob

相關問題