I'm having a frustrating time trying to get a session-scoped bean working with my application. I am developing a Spring-based server app that is being served via Tomcat with a Swing-based client. So far, here's the relevant config...
web.xml:
BaselineServiceBeans.xml (server-side):Code:<web-app> <!-- the context specified to the web-app --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/BaselineServiceBeans.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> <servlet> <servlet-name>remoting</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>remoting</servlet-name> <url-pattern>/remoting/*</url-pattern> </servlet-mapping> </web-app>
applicationContext.xml:Code:<beans default-lazy-init="true"> <bean id="baselineService" class="iwp.baseline.services.impl.BaselineServiceImpl" scope="singleton" /> <bean id="hibernateAuthAdapter" class="iwp.baseline.services.spring.util.HibernateAuthAdapter" scope="session"> <aop:scoped-proxy /> </bean> <bean id="baselineClientService" class="iwp.baseline.services.impl.BaselineClientServiceImpl" scope="singleton"> <property name="baselineService" ref="baselineService"/> <property name="authAdapter" ref="hibernateAuthAdapter"/> </bean> <!-- other beans --> </beans>
BaselineServiceBeans.xml on the client side:Code:<beans default-lazy-init="true"> <!-- hibernate stuff and other beans --> <bean id="baselineAuthAdapter" class="iwp.baseline.services.spring.util.HibernateAuthAdapter"> </bean>
The issue:Code:<beans default-lazy-init="true"> <bean id="remoteBaselineClientService" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean"> <property name="serviceInterface" value="iwp.baseline.services.BaselineClientService" /> <property name="serviceUrl" value="/url/to/baselineClientService" /> <property name="httpInvokerRequestExecutor"> <ref bean="httpInvokerExecutor" /> </property> </bean> <bean id="localBaselineClientService" class="iwp.baseline.services.impl.BaselineClientServiceImpl" /> <alias name="remoteBaselineClientService" alias="baselineClientService" /> <!-- Remoting --> <bean id="httpInvokerExecutor" class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor"> <property name="readTimeout" value="0" /> </bean> </beans>
The hibernateAuthAdapter bean stores the currently logged-in user, thus why it should be session-scoped. Logging in works fine; however, when I go back later to query it for the user, it comes back as null, which likely means a new hibernateAuthAdapter instance was created for the getUser() call some time after the log in. So what I'm guessing is that the session-scoped bean is not properly hooked up to a session with the client. To try to address that, I added the RequestContextListener to web.xml as you can see above, but I got the same result. Reading the Javadoc for RCL, it seems it really isn't meant for the purpose of keeping track of sessions.
This seems like a pretty basic problem: connect a session between a client and the server to keep semi-persistent data around during the lifetime of the application. What am I missing in my configuration?
Thanks a bunch!
(P.S.: I cut out bean definitions that are irrelevant to the auth adapter - if any of you need to see more, let me know.)


Reply With Quote