You can absolutely do what you mention and use @RequestScoped
beans in an @Stateless
session bean and an @MessageDriven
bean. This is a core part of the CDI spec and TCK and guaranteed portable.
Note on MDBs
Do be aware that there is a test for a @Stateless
bean that uses a @RequestScoped
bean, but there is no test that guarantees a @MessageDriven
bean can reference @RequestScoped
beans. This was just an oversight and is already fixed for the Java EE 7 TCK. So just be aware that if it doesn't work for the MDB case, it may not be your fault :)
The workaround would be to simply have your MDB delegate to a SessionBean of any kind as @Stateless
, @Stateful
, and @Singleton
all have @RequestScoped
tests.
Making the EJB, itself, scoped
While @Stateless
, @Singleton
and @MessageDriven
can have scoped references injected via @Inject
, they cannot be @RequestScoped
or any other scope. Only the @Stateful
model is flexible enough to support scopes. In other words, you can annotate the @Stateful
bean class itself as @RequestScoped
, @SessionScoped
, etc..
In simple terms @Stateless
, @Singleton
have fixed "scopes" already. @Singleton
is essentially @ApplicationScoped
and @Stateless
would perhaps be some made-up scope like @InvocationScoped
, if that existed. The lifecycle of an @MessageDriven
bean is entirely up to the Connector that drives it and is therefore also not allowed to have user-defined scope.