[
https://issues.apache.org/jira/browse/TOMEE-509?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13485971#comment-13485971
]
Donatas Ciuksys commented on TOMEE-509:
---------------------------------------
> such an entity manager (of a stateful) only exist if the stateful exist, if
> you produce the em (without scope??) the stateful hasn't to exist (and that's
> the case you had) so the real em doesn't exist too
Nope, real process is different, as per CDI spec:
5.5.4. Invocation of producer or disposer methods
When the container calls a producer or disposer method, the behavior depends
upon whether the method is static or nonstatic:
• If the method is static, the container must invoke the method.
• Otherwise, if the method is non-static, the container must:
- Obtain a contextual instance of the bean which declares the method, as
defined by Section 6.5.2, “Contextual instance
of a bean”.
- Invoke the method upon this instance, as a business method invocation, as
defined in Section 7.2, “Container invocations
and interception”.
So, stateful EJB is being constructed before producer method invocation (and
put to respective CDI context for further reuse).
> Injected extended EntityManager is not registered (cannot be used for DB
> operations)
> ------------------------------------------------------------------------------------
>
> Key: TOMEE-509
> URL: https://issues.apache.org/jira/browse/TOMEE-509
> 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: Critical
>
> 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
> public class A {
>
> @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. Deploy (successful) and run the application - observe error message
> (printed in browser):
> An Error Occurred:
> InternalError: an entity manager should already be registered for this
> extended persistence unit
> viewId=/index.xhtml
> location=D:\dev\proj\templates\InjectionDemo\build\web\index.xhtml
> phaseId=RENDER_RESPONSE(6)
> Caused by:
> java.lang.IllegalStateException - InternalError: an entity manager should
> already be registered for this extended persistence unit
> at
> org.apache.openejb.persistence.JtaEntityManagerRegistry.getEntityManager(JtaEntityManagerRegistry.java:99)
> - Stack Trace
> java.lang.IllegalStateException: InternalError: an entity manager should
> already be registered for this extended persistence unit
> at
> org.apache.openejb.persistence.JtaEntityManagerRegistry.getEntityManager(JtaEntityManagerRegistry.java:99)
> at
> org.apache.openejb.persistence.JtaEntityManager.getEntityManager(JtaEntityManager.java:80)
> at
> org.apache.openejb.persistence.JtaEntityManager.getDelegate(JtaEntityManager.java:114)
> at
> org.apache.openejb.persistence.JtaEntityManager.getDelegate(JtaEntityManager.java:53)
> at beans.A.getDelegateClassName(A.java:19)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> ...
--
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