Is it possible to inject a request-scoped CDI bean into a Stateless session bean?
I had asked a related question and thought the specific CDI @RequestScoped into @Stateless question merited its own post.
Passing state between EJB methods / @RequestScoped and @Stateless
I also asked a similar question about JMS @MessageDriven beans - basically want to know the same about @Stateless.
@RequestScoped CDI injection into @MessageDriven bean
A stateful session bean is a session bean that maintains conversational state. Stateful session beans are useful for conversational sessions, in which it is necessary to maintain state, such as instance variable values or transactional state, between method invocations.
Use @Stateless annotation to signify it a stateless bean. EJB Container automatically creates the relevant configurations or interfaces required by reading this annotation during deployment.
11. Re: Are Stateless Session EJB Thread-safe. Yes it's thread-safe.
A stateless session bean does not maintain a conversational state with the client. When a client invokes the methods of a stateless bean, the bean's instance variables may contain a state specific to that client but only for the duration of the invocation.
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With