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的錯誤或誤解在哪裏?
我在想,你解決了這個問題嗎?我的答案被降低了,我很好奇,爲什麼? @Andrey Z. – rob