Guice Servlet Problem: Not inside an HTTP Servlet request

1,251 views
Skip to first unread message

opn

unread,
Mar 26, 2011, 1:53:58 PM3/26/11
to google-guice
Hello,
i've got a problem since i migrated from Warp Persist to guice persist
which i can not really understand.

I'm working on an app that is using the built in login mechanism from
glassfishV3. To use this I'm injecting a Provider<HttpServletRequest>
in my class.
When using Warp Persist that is not a problem. I set everything up,
especially to mention the Guice Filter, (also the new version 3.0 one)
and everything works like a charm! I can inject the Request, Session
and all the stuff.

Now I just removed the Warp dependencies and set up Guice Persist and
suddenly i get the exception:

"Error in custom provider, com.google.inject.OutOfScopeException:
Cannot access scoped object. Either we are not currently inside an
HTTP Servlet request, or you may have forgotten to apply
com.google.inject.servlet.GuiceFilter as a servlet filter for this
request."

when I'm trying to inject a HttpServletRequest.

The funny thing is that Guice Persist itself is working. I can get,
insert and remove Entities without problems.
I also did not change anything regarding the GuiceFilter!

I spent the whole day trying things out, but nothing solved my
problem. Mainly i played around with the filter mappings in my web.xml
and the ServletModule where I define my JPA Unit.

My setup here is:
GlassfishV3.1
Guice 3.0

web.xml parts that could be important:

<filter>
<filter-name>guiceFiler</filter-name>
<filter-class>com.google.inject.servlet.GuiceFilter</filter-
class>
</filter>
<filter-mapping>
<filter-name>guiceFiler</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<security-constraint>
<web-resource-collection>
<web-resource-name>login area</web-resource-name>
<url-pattern>/index.xhtml</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>

The security constraint makes an automatic redirect to https on the
login page (index.xhtml) but, as already said, warp persist had no
problem with that.

ServletModule:

public class MyModule extends ServletModule {
//got a few Singleton bindings in here, this shouldn't be a problem,
should it?
/* Guice Persist */
install(new JpaPersistModule("MyPersistenceUnit"));
bind(GuiceInit.class).asEagerSingleton();
//filter("/*").through(GuiceFilter.class); tried that
filter("/*").through(PersistFilter.class);
}

GuiceInit class:

private final PersistService service;
public class GuiceInit {
@Inject
GuiceInit(PersistService service) {
this.service = service;
this.service.start();
}

public PersistService getService() {
return service;
}
}

public class UserDaoImpl extends DaoImpl<Long, User> implements
UserDao {
private final Provider<HttpServletRequest> requestProvider;

@Inject
public UserDaoImpl(Provider<EntityManager> entityManagerProvider,
Provider<HttpServletRequest> requestProvider) {
super(entityManagerProvider);
this.requestProvider = requestProvider;
}
@Transactional
public User logUserIn(String loginName, String password) {
try {
//User user = findByLoginName("admin"); THAT WORKS!
HttpServletRequest request = requestProvider.get() //THAT
DOES NOT :(
...
} ...
}

I was also able to lookup the Request by myself, so it is there! ; )

I'm happy about every hint, as i would like to migrate completely to
the new stuff after i read yesterday in the warp persist forum that
warp persist now lives on as guice persist!

Regards
Alex

opn

unread,
Mar 26, 2011, 2:39:15 PM3/26/11
to google-guice
Sorry forgot to mention that one of the Singleton bindings in my
ServletModule is the UserDaoImpl class that should be able to inject
the request. Also i can not bind anything in Session- or RequestScope
and inject it then through a provider. It's always the same Exception.

Sorry again should have read the post once again before posting!
Reply all
Reply to author
Forward
0 new messages