STATELESS component injection rules are not intuitive/undocumented
------------------------------------------------------------------
Key: JBSEAM-368
URL:
http://jira.jboss.com/jira/browse/JBSEAM-368
Project: JBoss Seam
Issue Type: Bug
Reporter: Christian Bauer
Priority: Minor
This is probably a non-issue, so feel free to ignore.
It took me a while to figure out why this works:
@In(create=true)
MyStatelessComponent myComponent;
but this doesn't:
@In
MyStatelessComponent myComponent;
It was easy to figure out that it apparently is required, but from looking at the
documentation this isn't clear. I also found it difficult to think about
"creation of a component" when it is already there in the stateless EJB pool. I
checked the code and there is some consistency in the internal logic, of course.
Users however might read the docs and say: "@In searches all contexts hierarchically,
so it should find myComponent in STATELESS, because Seam logged that binding on
startup."
Also, attempts to remove the create="true" with
@In(value = "myComponent", scope = ScopeType.STATELESS)
MyStatelessComponent myComponent;
resulted in JNDI lookup("myComponent"), which makes not much sense and returns
null.
I suggest we add something to the documentation about lookup/injection of stateless
components (I'm not sure if I'm 100% right about this, otherwise I would have
added it).
Side note, I found the following additional debug logging lines in Component.java very
helpful during development:
private Object getInstanceToInject(In in, String name, Object bean, boolean
enforceRequired)
{
Object result;
if ( name.startsWith("#") )
{
log.debug("Searching for injection variable with value binding expression:
" + name);
FacesContext facesCtx = FacesContext.getCurrentInstance();
Application application = facesCtx.getApplication();
result = application.createValueBinding(name).getValue(facesCtx);
}
else if (in.scope()==ScopeType.UNSPECIFIED)
{
log.debug("Searching hierarchically for injection variable in all scopes:
" + name);
result = getInstance(name, in.create());
}
else
{
if ( in.create() )
{
throw new IllegalArgumentException(
"cannot combine create=true with explicit scope on @In: " +
getAttributeMessage(name)
);
}
log.debug("Searching for injection variable in scope: " + name +
", scope: " + in.scope());
result = in.scope().getContext().get(name);
}
if (result==null && enforceRequired && in.required())
{
throw new RequiredException(
"In attribute requires value for component: " +
getAttributeMessage(name)
);
}
else
{
return result;
}
}
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira