[
https://issues.apache.org/jira/browse/TOMEE-508?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13485937#comment-13485937
]
Donatas Ciuksys commented on TOMEE-508:
---------------------------------------
Hi Mark,
I spent couple of hours last friday investigating "serializable EntityManager"
problem, have read your blog post
(https://struberg.wordpress.com/2012/04/25/is-there-a-way-to-fix-the-jpa-entitymanager/)
too. I fully understand the issue with session management in cluster
environments, yet I think this is a separate issue. Not all clusters need
session synchronization, not every system needs clusters. I'd like to focus on
single server case (or cluster without high-availability). I'm trying to find
correct way how to implement large conversation-type use-cases (wizards etc.).
Java EE proposes @ConversationScoped stateful EJBs with EXTENDED
PersistenceContext, EntityManager inheritance and propagation. So I'm trying
now to check wether my code is actually portable (for now I have checked only
Glassfish).
Yes, CDI requires that passivation capable beans would use passivation capable
dependencies, and EntityManager dependency is not implied to be passivation
capable by default (let's not talk about CDI resource case - I'm actually
interested in EXTENDED PersistenceContext, and this one cannot be declared as
CDI resource). But plain JPA EntityManager is never returned to Java EE
application - it is always wrapped (API has unwrap method too). And:
1. If EntityManager is not serializable, the wrapper could be (and in Glassfish
case it is: com.sun.enterprise.container.common.impl.EntityManagerWrapper
implements Serializable)
2. OpenJPA bug fix (https://issues.apache.org/jira/browse/OPENJPA-126) claims
to have added the serializability support. Similar bug fix could be found for
Hibernate too.
Again, I'm not trying here to defend "serializable EntityManager" case, but I
strongly believe that if EJB container wraps EntityManager, the wrapper itself
could be serializable - this makes programmer life simpler.
> 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