[jboss-jira] [JBoss JIRA] Commented: (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=comments#action_12344551 ] 
            
Gavin King commented on JBSEAM-368:
-----------------------------------

Actually the current implementation of StatelessContext is pretty much broken. It should either delegate to Component.getInstance(), or else just be removed.

> 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

        



More information about the jboss-jira mailing list