Status: Resolved (View Workflow)
Affects Version/s: 1.1.12.Final, 2.0.0.Final
Fix Version/s: 2.1.0.Beta1
Component/s: Servlet Container Support
Steps to Reproduce:
Package and deploy the example application to tomcat
clear browser cache
open the fist page http://localhost:8080/weldissuetomcat/issue.jsf
click the link at the first line
You have a big chance (>50%) to see the exception
If not reproduced, close the browser and clear cache to try again.
Git Pull Request:
There's a race condition in AbstractConversationContext when create first conversation scope if it's the first request of one session.
Suppose such scenario
- User requests a jsf page
- weld creates a conversations map in the AbstractConversationContext.associate()
- Because it is the first request, there's no session. Weld keep this map in request
- A conversation scoped bean is created and put to the map.
- In somewhere, a session is created
- In the render phase, server sends partial response back. The page need some jsf resource, eg, jsf2 ajax or jsf resource
- Browser requests the new jsf resource
- At this time The first request has not finished. So it doesn't reach dissociate() and doesn't put conversations map in the session.
- Meanwhile The second request reach associate(). There's no conversations map in the session, and the session is existing. It puts its new map! <====
- Then, even the first request reach dissociate(), because there's already a map, it doesn't put its owner anymore. <====
A quick and dirty fix is always create session before associate(). However, it's better to merge the map in the dissociate()
I upload a example which is very easy to reproduce the problem.