Status: New
Owner: ----

New issue 781 by [email protected]: Guice Servlet Contex injection issue/enchancment
http://code.google.com/p/google-guice/issues/detail?id=781

Hello,

I just had problem with ServletContext injection.

After deployment of Guiced war to my Tomcat I get this error:
WARNING: You are attempting to use a deprecated API (specifically, attempting to @Inject ServletContext inside an eagerly created singleton. While we allow this for backwards compatibility, be warned that this MAY have unexpected behavior if you have more than one injector (with ServletModule) running in the same JVM. Please consult the Guice documentation at http://code.google.com/p/google-guice/wiki/Servlets for more information. Nov 11, 2013 5:11:38 PM org.apache.catalina.core.StandardContext startInternal
SEVERE: Error listenerStart

Well, the error message "SEVERE: Error listenerStart" is pretty straightforward, isn't it? No, I'm just kidding. This was like a nightmare to figure out whats wrong. So, I would like to help to get rid of such errors by changing concept. Not only by telling how to solve it.

How to reproduce this error:
1. I have class inheritance like this ProdConfig > AppConfig > GuiceServletContextListener + HttpSessionListener 2. ProdConfig contains final Injector variable. So, injector is created before contextInitialized(). 3. Injector contains a module, which depends on ServletContext (Apache Shiro lets say)
4. Finally, create Injector in Production stage. (Eager creation)
5. Tramdada, you got the same message.

How to solve:
1. Set stage to Development. (Lazy creation)
2. Change Injector variable to be non-final and create it inside getInjector(). (It will be called inside contextInitialized() first time.)

How to solve by concept:
1. Lets say Guice Injector is highest point of abstraction from application point of view.
2. I think ServletContext is one level of abstraction higher.
3. So, why we do not stick with IoC/DI pattern and let somebody else to resolve this dependency. 4. The idea is to overload GuiceServletContextListener.getInjector() with GuiceServletContextListener.getInjector(ServletContext.class) 5. And also it would be nice to have ServletModule constructor with ServletContext.class argument. 6. Well, this take a bit of simplicity but bring more confidence of your code. Because, ServletModule(ServletContext.class) cannot be created via GuiceServletContextListener constructor or just as final variable, but only via getInjector(ServletContext.class) by concept.

or

1. At least there could be one more error message in BackwardsCompatibleServletContextProvider.get() when GuiceFilter.getServletContext() is null. Something like "You probably created injector in Production stage (or with eagerly singletons) outside GuiceServletContextListener.getInjector() method."

PS: If this is somehow feasible for you to put it into Guice 4 or higher. I'm willing to help with some contribution.

Best regards,
Milan





--
You received this message because this project is configured to send all issue notifications to this address.
You may adjust your notification preferences at:
https://code.google.com/hosting/settings

--
You received this message because you are subscribed to the Google Groups 
"google-guice-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/google-guice-dev.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to