Summary: | StandardContext's annotationProcessor field gets cached between webapp start/stop cycles | ||
---|---|---|---|
Product: | Tomcat 6 | Reporter: | Nándor Előd Fekete <20090908> |
Component: | Catalina | Assignee: | Tomcat Developers Mailing List <dev> |
Status: | RESOLVED FIXED | ||
Severity: | major | CC: | 20090908 |
Priority: | P2 | ||
Version: | 6.0.20 | ||
Target Milestone: | default | ||
Hardware: | PC | ||
OS: | Windows XP | ||
Attachments: | Patch file contatining the proposed fix |
Thanks for the patch. It has been proposed for 6.0.x. Not that there is no need for a similar patch in trunk, the instanceManager is already set to null on stop. This has been applied to 6.0.x and will be included in 6.0.21 onwards. Again, many thanks for the patch. |
Created attachment 24222 [details] Patch file contatining the proposed fix When a webapp is stopped in tomcat, the annotationProcessor field does not get nullified. When the webapp is started again, the start() method of the StandardContext class checks whether the annotationProcessor field is null, and only builds a new one if so. This means that the annotationProcessor gets reused between application start/stop cycles (not tomcat restart cycles). Things that are dependent on the annotationProcessor (like injection, etc) may be broken because of this. One specific example is when using OpenEJB tomcat integration. The annotationProcesor itself holds a reference to a javax.naming.Context, which is cached between context start/stop cycles. This causes that after a stop/start cycle of a context, the annotationProcessor tries to inject the EJB reference proxies made at the first start of the context, which was made against different instances of the to-be-injected fields' classes. This results that the EJB injection is not working. Other types of injections may be broken too. Attached patch file containing the fix. Tested, works.