[jbossseam-issues] [JBoss JIRA] Commented: (JBSEAM-2419) IAE: factory method with defined scope outjected a value: guestRole

Clement Denis (JIRA) jira-events at lists.jboss.org
Sat Sep 5 13:03:23 EDT 2009


    [ https://jira.jboss.org/jira/browse/JBSEAM-2419?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12484637#action_12484637 ] 

Clement Denis commented on JBSEAM-2419:
---------------------------------------

I'm getting this error too, and it is indeed a concurrency issue.

It can happen  with a component that injects another component created from a @Factory with a defined scope and a return value.

It happened for me when I called this compoennt twice at the exact same time with two simultaneous REST calls.

The concurrency issue starts when calling  org.jboss.seam.Component.getComponent (at line 1982)  : for both calls, the "Contexts.lookupInStatefulContexts(name)" returns null. (line numbers refer to version 2.2.0.GA)

So, both calls try to produce a value from the factory method (wich is wrong because the factory should be called only once for the defined scope).

If the first call outjects the value at a wrong time, the method handleFactoryMethodResult throws an exception for the second call, because "Contexts.lookupInStatefulContexts(name);" at the beginning of the method returns the value outjected by the first call, and this is considered wrong if the @Factory defines a scope.

A quick fix would be to check the actual return type of the factory method and throw the exception only if the factory returns void.

The best solution would be to avoid duplicate calls to a factory method, but I presume it would require major changes to the org.jboss.seam.Component.getComponent methods (maybe synchronization ...)






> IAE: factory method with defined scope outjected a value: guestRole
> -------------------------------------------------------------------
>
>                 Key: JBSEAM-2419
>                 URL: https://jira.jboss.org/jira/browse/JBSEAM-2419
>             Project: Seam
>          Issue Type: Bug
>          Components: Core
>            Reporter: Christian Bauer
>            Priority: Minor
>
> I can see this on the log on seamframework.org but can't reproduce it:
> java.lang.IllegalArgumentException: factory method with defined scope outjected a value: guestRole
>         at org.jboss.seam.Component.handleFactoryMethodResult(Component.java:1953)
>         at org.jboss.seam.Component.getInstanceFromFactory(Component.java:1927)
>         at org.jboss.seam.Component.getInstance(Component.java:1863)
>         at org.jboss.seam.Component.getInstance(Component.java:1840)
>         at org.jboss.seam.Component.getInstance(Component.java:1834)
>         at org.jboss.seam.wiki.core.action.Authenticator.getGuestAccessLevel(Authenticator.java:199)
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>         at java.lang.reflect.Method.invoke(Method.java:585)
>         at org.jboss.seam.util.Reflections.invoke(Reflections.java:21)
>         at org.jboss.seam.intercept.RootInvocationContext.proceed(RootInvocationContext.java:31)
>         at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:56)
>         at org.jboss.seam.transaction.RollbackInterceptor.aroundInvoke(RollbackInterceptor.java:31)
>         at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
>         at org.jboss.seam.core.BijectionInterceptor.aroundInvoke(BijectionInterceptor.java:46)
>         at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
>         at org.jboss.seam.core.MethodContextInterceptor.aroundInvoke(MethodContextInterceptor.java:42)
>         at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
>         at org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:107)
>         at org.jboss.seam.intercept.JavaBeanInterceptor.interceptInvocation(JavaBeanInterceptor.java:166)
>         at org.jboss.seam.intercept.JavaBeanInterceptor.invoke(JavaBeanInterceptor.java:102)
>         at org.jboss.seam.wiki.core.action.Authenticator_$$_javassist_9.getGuestAccessLevel(Authenticator_$$_javassist_9.java)
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>         at java.lang.reflect.Method.invoke(Method.java:585)
>         at org.jboss.seam.util.Reflections.invoke(Reflections.java:21)
>         at org.jboss.seam.util.Reflections.invokeAndWrap(Reflections.java:125)
>         at org.jboss.seam.Component.callComponentMethod(Component.java:2082)
>         at org.jboss.seam.Component.getInstanceFromFactory(Component.java:1926)
>         at org.jboss.seam.Component.getInstance(Component.java:1863)
>         at org.jboss.seam.Component.getInstance(Component.java:1840)
>         at org.jboss.seam.Namespace.getComponentInstance(Namespace.java:55)
>         at org.jboss.seam.Namespace.getComponentInstance(Namespace.java:50)
>         at org.jboss.seam.el.SeamELResolver.resolveBase(SeamELResolver.java:166)
>         at org.jboss.seam.el.SeamELResolver.getValue(SeamELResolver.java:53)
>         at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53)
>         at org.jboss.el.parser.AstIdentifier.getValue(AstIdentifier.java:44)
>         at org.jboss.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
>         at org.jboss.seam.core.Expressions$1.getValue(Expressions.java:111)
>         at org.jboss.seam.persistence.HibernatePersistenceProvider.enableFilter(HibernatePersistenceProvider.java:205)
>         at org.jboss.seam.persistence.ManagedPersistenceContext.initEntityManager(ManagedPersistenceContext.java:88)
>         at org.jboss.seam.persistence.ManagedPersistenceContext.getEntityManager(ManagedPersistenceContext.java:108)
> This is thrown from the FeedServlet.
> The code doesn't do what the exception says it is doing:
>     /**
>      * Assigns the context variable 'currentAccessLevel' when no user is logged in.
>      * @return Integer Guest access level.
>      */
>     @Factory(value = "currentAccessLevel", scope = ScopeType.SESSION, autoCreate = true)
>     public Integer getGuestAccessLevel() {
>         return ((Role)Component.getInstance("guestRole")).getAccessLevel();
>     }
> This has to be investigated further.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the seam-issues mailing list