[jboss-jira] [JBoss JIRA] Updated: (JBSEAM-368) STATELESS component injection rules are not intuitive/undocumented
Gavin King (JIRA)
jira-events at jboss.com
Tue Oct 3 13:27:41 EDT 2006
[ http://jira.jboss.com/jira/browse/JBSEAM-368?page=all ]
Gavin King updated JBSEAM-368:
------------------------------
Priority: Critical (was: Minor)
> 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: Critical
>
> 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
More information about the jboss-jira
mailing list