Why did you declare your servlet both in web.xml, and in your
MyServletModule?
This means that the servlet container will directly instantiate your
servlet, not Guice.
You must only keep GuiceFilter and the ContextListener in web.xml
Cheers, Jean-François
On 29-09-2012 01:02, Mario Rodriguez wrote:
Hi,
I'm having problems when I try to @Inject a service on a Servlet.
Currently I'm not receiving any error but my service is null. This
problem only happens on my servlet as the service works in another
places of the app.
What I have is something like this:
mainFolder
+ server
+ serviceFolder
- MyService.java
- MyServletContextListener.java
- MyServletModule.java
- HelloWorldServlet.java
+ WEB-INF
- web.xml
The files looks like:
1) web.xml
<web-app>
………
<servlet>
<servlet-name>helloWorldServlet</servlet-name>
<servlet-class>
mainFolder.HelloWorldServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloWorldServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>guiceFilter</filter-name>
<filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>guiceFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>com.google.crm.grm.refdata.server.RefDataServletContextListener</listener-class>
</listener>
</web-app>
2) MyService.java
@RequestScoped
public class GrmDataService {
……..
public List<String> getFoo() {
…..
}
……..
}
3) MyServletContextListener.java
public class MyServletContextListener extends
GuiceServletContextListener {
@Override
protected Injector getInjector() {
return Guice.createInjector(
// Probably something is wrong here as I'm adding a module
where the service live but on
// that service I don't have a direct binding for this specific
service
….
}
}
4) MyServletModule.java
public class MyServletModule extends ServletModule {
@Override
protected void configureServlets() {
Names.bindProperties(binder(), getProps());
……..
serve("/path").with(HelloWorldServlet.class);
……..
}
…….
}
5) HelloWorldServlet.java
@Singleton
public class HelloWorldServlet extends HttpServlet {
@Inject
private Provider<MyService> myServiceProvider;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse
response)
throws IOException {
response.setContentType("text/plain");
if (myServiceProvider != null) {
MyService myService = myServiceProvider.get();
response.getWriter().println("The service is not null");
} else {
response.getWriter().println("The service is null");
}
}
……
}
Of course I always receive the message "The service is null".
Just as a test I create a filter class on the same packages as
HelloWorldServlet.java where I @Inject the provider on the same way:
@Singleton
public class MyServiceFilter implements Filter {
@Inject
private final Provider<MyService> myServiceProvider;
……
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse
servletResponse,
FilterChain filterChain) throws IOException, ServletException {
if (servletRequest instanceof HttpServletRequest) {
HttpServletRequest request = (HttpServletRequest) servletRequest;
MyService myService = myServiceProvider.get();
List<String> myFoo = myService.getFoo();
…..
}
}
….
}
And this is working!!!
Any thoughts?
Thanks,
Mario
--
You received this message because you are subscribed to the Google
Groups "google-guice" group.
To view this discussion on the web visit
https://groups.google.com/d/msg/google-guice/-/BHRRaNYRCDMJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/google-guice?hl=en.
--
You received this message because you are subscribed to the Google Groups
"google-guice" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/google-guice?hl=en.