[
https://issues.apache.org/jira/browse/TOMEE-508?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13485910#comment-13485910
]
Mark Struberg commented on TOMEE-508:
-------------------------------------
The spec is not saying anything about serializability of injected EMs.
"3.6. Additional built-in beans" defines
* javax.transaction.UserTransaction,
* javax.security.Principal,
* javax.validation.ValidationFactory,
* javax.validation.Validator,
"These beans are passivation capable dependencies, as defined in Section 6.6.2,
“Passivation capable dependencies”."
Since this paragraph doesn't mention anything about EntityManager or
EntityManagerFactory it is not guaranteed to be serializable.
The reason why this might work in GF is that EclipseLink might provide a
Serializable EntityManager (which is btw a lie).
Btw, there is NO EntityManager on the planet which is guaranteed to be
Serializable. Thats just bollocks. EM-per-session is just a broken pattern all
the way! What is your use case? Imo the EM samples we have in the CDI spec are
just misleading as managed-EM injection in to CDI beans is not really well
defined. Who manages the transaction for such an EM? As long as we dont have
@Transactional outside of EJB you will not be able to manage it yourself.
> EntityManager dependency considered not passivation capable (CDI spec
> violation)
> --------------------------------------------------------------------------------
>
> Key: TOMEE-508
> URL: https://issues.apache.org/jira/browse/TOMEE-508
> Project: TomEE
> Issue Type: Bug
> Affects Versions: 1.5.0, 1.5.1
> Environment: Windows 7 x64; jdk1.7.0_09 32 bit;
> apache-tomee-1.5.1-20121026.064316-51-webprofile.zip
> Reporter: Donatas Ciuksys
> Priority: Blocker
>
> 1. Create class EntityManagerProducer:
> @SessionScoped
> @Stateful
> public class EntityManagerProducer implements Serializable {
>
> @PersistenceContext(type=PersistenceContextType.EXTENDED)
> private EntityManager em;
>
> @Produces
> public EntityManager getEntityManager() {
> return em;
> }
> }
> 2. Create injection client:
> @Named
> @SessionScoped
> @Stateful
> public class A implements Serializable {
>
> @Inject
> private EntityManager em;
> public String getDelegateClassName() {
> return em.getDelegate().getClass().getCanonicalName();
> }
>
> }
> 3. Create JSF page and try to call getDelegateClassName():
> <h:body>
> EntityManager is open: #{a.delegateClassName}
> </h:body>
> 4. Try to deploy the application to tomee - observe error message:
> Caused by: org.apache.openejb.OpenEJBRuntimeException:
> org.apache.webbeans.exception.WebBeansConfigurationException: Passivation
> capable beans must satisfy passivation capable dependencies. Bean : A,
> Name:a, WebBeans Type:ENTERPRISE, API Types:[java.lang.Object,beans.A],
> Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default,javax.inject.Named]
> does not satisfy. Details about the Injection-point: Field Injection Point,
> field name : em, Bean Owner : [A, Name:a, WebBeans Type:ENTERPRISE, API
> Types:[java.lang.Object,beans.A],
> Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default,javax.inject.Named]]
> at
> org.apache.openejb.cdi.OpenEJBLifecycle.startApplication(OpenEJBLifecycle.java:323)
> at
> org.apache.openejb.cdi.ThreadSingletonServiceImpl.initialize(ThreadSingletonServiceImpl.java:150)
> ... 48 more
> Caused by: org.apache.webbeans.exception.WebBeansConfigurationException:
> Passivation capable beans must satisfy passivation capable dependencies. Bean
> : A, Name:a, WebBeans Type:ENTERPRISE, API Types:[java.lang.Object,beans.A],
> Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default,javax.inject.Named]
> does not satisfy. Details about the Injection-point: Field Injection Point,
> field name : em, Bean Owner : [A, Name:a, WebBeans Type:ENTERPRISE, API
> Types:[java.lang.Object,beans.A],
> Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default,javax.inject.Named]]
> at
> org.apache.webbeans.component.AbstractOwbBean.validatePassivationDependencies(AbstractOwbBean.java:695)
> at
> org.apache.webbeans.component.AbstractInjectionTargetBean.validatePassivationDependencies(AbstractInjectionTargetBean.java:595)
> at
> org.apache.openejb.cdi.BeansDeployer.checkPassivationScope(BeansDeployer.java:414)
> at org.apache.openejb.cdi.BeansDeployer.validate(BeansDeployer.java:260)
> at
> org.apache.openejb.cdi.BeansDeployer.validateInjectionPoints(BeansDeployer.java:222)
> at
> org.apache.openejb.cdi.OpenEJBLifecycle.startApplication(OpenEJBLifecycle.java:280)
> ... 49 more
> ---------------------------------
> I think this is CDI specification violation - page 3 of CDI specification
> contains following example:
> @SessionScoped @Model
> public class Login implements Serializable {
> @Inject Credentials credentials;
> @Inject @Users EntityManager userDatabase;
> ...
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira