2012-08-28 34 views
2

我有一個非常奇怪的問題,我的新Vaadin項目。 如果我啓動我的應用程序並使用用戶登錄,然後切換瀏覽器並再次打開網站,看起來會話將被共享。在Windows中我擁有相同的內容。Vaadin與春季和多個用戶

我參與了幾個有關此問題的論壇帖子,他們都說不要在同一瀏覽器中打開該應用程序。好吧,我啓動一個虛擬機,但是,同樣的問題。或者,從上下文中刪除所有靜態變量。我已經完成了,現在使用ThreadLocal-Pattern。

我絕對不知道什麼是錯的。我認爲Spring Context殺死了Vaadin,有沒有人有過與Vaadin和Spring的經驗?

爲了使Spring和Vaadin togehter我使用Spring Intgration附加組件的Vaadin尼古拉斯·弗蘭克爾(https://vaadin.com/directory#addon/spring-integration)

我會後我的應用程序代碼進行進一步調查。

===================

的Vaadin應用類:

public class MainApplication extends Application implements HttpServletRequestListener { 
private static final long serialVersionUID = 2067470624065324231L; 

private static ThreadLocal<MainApplication> threadLocal = new ThreadLocal<MainApplication>(); 

private Window mainWindow; 

//Viewmanager 
private ViewManager viewManager; 

private Professor professor; 

//DAO Classes and Bean Setter´s 
ProfessorDAO professorDAO; 
QuestionDAO questionDAO; 
AnswerDAO answerDAO; 
AnsweredDAO answeredDAO; 
QRCodeDAO qrCodeDAO; 

public void setProfessorDAO(ProfessorDAO professorDAO) { 
    System.out.println("Setting ProfessorDAO!"); 
    System.out.println(professorDAO.toString()); 
    this.professorDAO = professorDAO; 
} 

public void setQuestionDAO(QuestionDAO questionDAO) { 
    System.out.println("Setting QuestionDAO!"); 
    System.out.println(questionDAO.toString()); 
    this.questionDAO = questionDAO; 
} 

public void setAnswerDAO(AnswerDAO answerDAO) { 
    System.out.println("Setting AnswerDAO!"); 
    System.out.println(answerDAO.toString()); 
    this.answerDAO = answerDAO; 
} 

public void setAnsweredDAO(AnsweredDAO answeredDAO) { 
    System.out.println("Setting AnsweredDAO!"); 
    System.out.println(answeredDAO.toString()); 
    this.answeredDAO = answeredDAO; 
} 

public void setQrCodeDAO(QRCodeDAO qrCodeDAO) { 
    System.out.println("Setting QRCodeDAO!"); 
    System.out.println(qrCodeDAO.toString()); 
    this.qrCodeDAO = qrCodeDAO; 
} 

public ProfessorDAO getProfessorDAO() { 
    return professorDAO; 
} 

public QuestionDAO getQuestionDAO() { 
    return questionDAO; 
} 

public AnswerDAO getAnswerDAO() { 
    return answerDAO; 
} 

public AnsweredDAO getAnsweredDAO() { 
    return answeredDAO; 
} 

public QRCodeDAO getQrCodeDAO() { 
    return qrCodeDAO; 
} 

//Currently logged in Professor. 
public Professor getProfessor() { 
    return professor; 
} 

public void setProfessor(Professor professor) { 
    this.professor = professor; 
} 



public static void setInstance(MainApplication application){ 
    threadLocal.set(application); 
} 

public ViewManager getViewManager() { 
    return viewManager; 
} 

public void setViewManager(ViewManager viewManager) { 
    this.viewManager = viewManager; 
} 

public static MainApplication getInstance(){ 
    return threadLocal.get(); 
} 

public MainApplication() { 
} 

@Override 
public void init() { 
    setInstance(this); 

    setTheme("crs"); 

    mainWindow = new Window("CRS -- Classroom Response System"); 
    setMainWindow(mainWindow); 

    viewManager = new ViewManager(mainWindow); 

    viewManager.switchScreen(LoginScreen.class.getName(), new LoginScreen()); 


    //mainWindow = new MainWindow("CRS -- Classroom Response System"); 
    //setMainWindow(mainWindow); 


} 


public void onRequestStart(HttpServletRequest request, 
     HttpServletResponse response) { 
    MainApplication.setInstance(this); 

} 

public void onRequestEnd(HttpServletRequest request, 
     HttpServletResponse response) { 
    threadLocal.remove(); 

} 

的web.xml中:

<display-name>CRSServer</display-name> 


<context-param> 
    <description> 
    Vaadin production mode</description> 
    <param-name>productionMode</param-name> 
    <param-value>false</param-value> 
</context-param> 


<servlet> 
    <servlet-name>CRS</servlet-name> 
    <servlet-class>ch.frankel.vaadin.spring.SpringApplicationServlet</servlet-class> 
    <init-param> 
     <description> 
     Vaadin application class to start</description> 
     <param-name>applicationBeanName</param-name> 
     <param-value>cs.hm.edu.kreipl.crs.frontend.MainApplication</param-value> 
    </init-param> 

    <init-param> 
     <description> 
     Application widgetset</description> 
     <param-name>widgetset</param-name> 
     <param-value>cs.hm.edu.kreipl.crs.widgetset.CrsserverWidgetset</param-value> 
    </init-param> 
</servlet> 


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

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


<listener> 
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
</listener> 


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

春天背景

<context:component-scan base-package="cs.hm.edu.kreipl.crs" /> 
<bean id="myDataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" 
     value="com.mysql.jdbc.Driver"> 
    </property> 
    <property name="url" value="jdbc:mysql://localhost:3306/crs"></property> 
    <property name="username" value="crs"></property> 
    <property name="password" value="password"></property> 
</bean> 

<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="myDataSource"/> 
    <property name="annotatedClasses"> 
     <list> 
      <value>cs.hm.edu.kreipl.crs.database.entity.Professor</value> 
      <value>cs.hm.edu.kreipl.crs.database.entity.Answer</value> 
      <value>cs.hm.edu.kreipl.crs.database.entity.Answered</value> 
      <value>cs.hm.edu.kreipl.crs.database.entity.Question</value> 
      <value>cs.hm.edu.kreipl.crs.database.entity.QuestionQRCode</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hbm2ddl.auto">create</prop> 
    </props> 
    </property> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="mySessionFactory" /> 
</bean> 

<tx:annotation-driven/> 

<!-- VAADIn Startup --> 
<bean id="cs.hm.edu.kreipl.crs.frontend.MainApplication" class="cs.hm.edu.kreipl.crs.frontend.MainApplication"> 
    <property name="answerDAO" ref="answerDAO" /> 
    <property name="answeredDAO" ref="answeredDAO" /> 
    <property name="professorDAO" ref="professorDAO" /> 
    <property name="qrCodeDAO" ref="qrCodeDAO" /> 
    <property name="questionDAO" ref="questionDAO" /> 
</bean> 



<bean id="professorDAO" class="cs.hm.edu.kreipl.crs.database.implementation.ProfessorDAOImpl"> 
    <constructor-arg> 
     <value>cs.hm.edu.kreipl.crs.database.entity.Professor</value> 
    </constructor-arg> 
    <property name="hibernateTemplate" ref="mySessionFactory"/> 
</bean> 
<bean id="questionDAO" class="cs.hm.edu.kreipl.crs.database.implementation.QuestionDAOImpl"> 
    <constructor-arg> 
     <value>cs.hm.edu.kreipl.crs.database.entity.Question</value> 
    </constructor-arg> 
    <property name="hibernateTemplate" ref="mySessionFactory"/> 
</bean> 
<bean id="qrCodeDAO" class="cs.hm.edu.kreipl.crs.database.implementation.QRCodeDAOImpl"> 
    <constructor-arg> 
     <value>cs.hm.edu.kreipl.crs.database.entity.QuestionQRCode</value> 
    </constructor-arg> 
    <property name="hibernateTemplate" ref="mySessionFactory"/> 
</bean> 
<bean id="answerDAO" class="cs.hm.edu.kreipl.crs.database.implementation.AnswerDAOImpl"> 
    <constructor-arg> 
     <value>cs.hm.edu.kreipl.crs.database.entity.Answer</value> 
    </constructor-arg> 
    <property name="hibernateTemplate" ref="mySessionFactory"/> 
</bean> 
<bean id="answeredDAO" class="cs.hm.edu.kreipl.crs.database.implementation.AnsweredDAOImpl"> 
    <constructor-arg> 
     <value>cs.hm.edu.kreipl.crs.database.entity.Answered</value> 
    </constructor-arg> 
    <property name="hibernateTemplate" ref="mySessionFactory"/> 
</bean> 
<bean id="deviceDAO" class="cs.hm.edu.kreipl.crs.database.implementation.DeviceDAOImpl"> 
    <constructor-arg> 
     <value>cs.hm.edu.kreipl.crs.database.entity.Device</value> 
    </constructor-arg> 
    <property name="hibernateTemplate" ref="mySessionFactory"/> 
</bean> 

如果您需要任何進一步的分類請現在讓我來。

回答

1

我使用vaadin + spring但沒有Spring Intgration插件。 我認爲問題在於您沒有爲請求應用程序的新用戶創建新的Vaadin applicationBean。

在我的應用程序中,我將applicationBean傳遞給web.xml。我waadin應用程序都被註解:

應用類

@Component(value = "appName") 
@Scope(value = "session") 
class AppName extends Application { 
.... 
} 

WEB.XML

<init-param> 
     <param-name>applicationBean</param-name> 
     <param-value>appName</param-value> 
    </init-param> 

而對於每一個新的會話的Servlet返回新的應用程序。 在你的web.xml你通過vaadin應用程序是這樣的:

你的web.xml

<init-param> 
     <description> 
     Vaadin application class to start</description> 
     <param-name>applicationBeanName</param-name> 
     <param-value>cs.hm.edu.kreipl.crs.frontend.MainApplication</param-value> 
    </init-param> 

所以每次相同的應用程序爲所有用戶返回。這就是我認爲會導致問題的原因。

+0

嗨Marcin,我試過你的方法,它的工作,非常感謝。 – Chris

+0

沒問題Chris :) – kamuflage661