[
https://jira.jboss.org/jira/browse/JBSEAM-2419?page=com.atlassian.jira.pl...
]
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