2012-08-28 2 views
2

새로운 Vaadin 프로젝트에 정말 이상한 문제가 있습니다. 응용 프로그램을 시작하고 사용자로 로그인 한 다음 브라우저를 전환하고 사이트를 다시 열면 세션이 공유 된 것으로 보입니다. 두 Windows에서 동일한 내용을 가지고 있습니다.봄과 복수 사용자가있는 Vaadin

나는이 문제에 대한 몇 가지 포럼 게시물을 읽었는데, 그들은 모두 같은 브라우저에서 응용 프로그램을 열지 않는다고 말합니다. 좋아, 내가 VM을 시작하지만, 같은 문제. 또는 컨텍스트에서 모든 정적 변수를 제거하십시오. 이제 ThreadLocal-Pattern을 사용하여이 작업을 수행했습니다.

나는 무엇이 잘못 됐는지 전혀 몰라. 내가 믿는 바는 Spring Context가 Vaadin을 죽이고 Vaadin과 Spring에 대한 경험이있는 사람이 있습니까? 내가 더 내 응용 프로그램 코드를 게시 할 예정입니다

니콜라스 프랭클 (https://vaadin.com/directory#addon/spring-integration)에 의해 Vaadin이의 봄 Intgration 부가 기능을 사용 togehter

는 봄과 만약 angel을 가지고 조사.

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

angel이라는 응용 프로그램 클래스 :

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> 

더 이상 clas가 필요하면 ses는 저를 시키십시오 시키십시오.

답변

1

vaadin + spring을 사용하지만 Spring Intgration Addon을 사용하지 않고 있습니다. 문제는 응용 프로그램에 대한 요청 인 새 사용자에 대해 새 Vaadin applicationBean을 만들지 않는다는 것입니다.

내 응용 프로그램에서는 web.xml에 applicationBean을 전달합니다.

응용 프로그램 클래스

@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> 

그리고 모든 새로운 세션 서블릿 새로운 응용 프로그램을 반환에 대한 나의 waadin 응용 프로그램이 주석있다. 당신의 web.xml에 는이처럼 angel이라는 응용 프로그램을 전달합니다

당신의 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