4 Replies Latest reply on Nov 10, 2006 10:32 AM by pmuir

    Name of @In Parameters

      I am experiencing something in a production application that occurs infrequently (but enough to be worried); however, I am having trouble duplicating it. I am wondering if any has seen something like this?

      First, question to start debuging is what is the name of an @In component. Is it the SFSB name + the @In component name? That's what it looks like if I look at the exception. I thought the name of an @In component was it's name without any other prefix.

      I've included a stack trace below and the SFSB if anyone has a suggestion for how I can try and figure this out.

      I'm using Seam 1.0 on JBoss 4.0.4.

      Thanks,
      Chris....

      
      @Stateful
      @Name("shop.cart.checkout.paymethod")
      @LoggedIn
      @HandleException
      public class PaymethodAction implements IPaymethodAction {
      
       @In(create=true)
       FacesMessages facesMessages;
      
       @In(value="shop.cart.checkout")
       ICheckoutAction checkout;
      
       @In(value="loggedInUser", scope=ScopeType.SESSION)
       private User user;
      
       @DataModel(value="paymethods")
       private List<PayMethod> paymethods = null;
      
       @DataModelSelection(value="paymethods")
       @Out(required=false)
       private PayMethod paymethod = null;
      
       private MethodCC newMethod = new MethodCC();
      
       @Factory(value="paymethods")
       public void viewPaymethods(){
       paymethods = new ArrayList<PayMethod>();
       for(Iterator i = user.getPerson().getMethods().iterator(); i.hasNext(); ){
      
       paymethods.add((PayMethod) HibernateUtils.unProxy((PayMethod)i.next()));
       }
       }
      
       public String saveNewPaymethod(){
      
       newMethod.setMethodType(DAPaymethod.findPaymethodType("CC"));
      
       DACommon.save(newMethod);
       user.getPerson().addMethod(newMethod);
       checkout.getCart().setPaymethod(newMethod);
       paymethod = newMethod;
       paymethods = null;
       newMethod = new MethodCC();
       return "saved";
       }
      
       @Create
       public void start(){
       AppUtils.LOG.fatal(" ================= PaymethodAction start");
       }
      
       public MethodCC getNewMethod(){
       return newMethod;
       }
      
       public void setNewMethod(MethodCC method){
       this.newMethod = method;
       }
      
       public PayMethod getFixSelected(){
       return paymethod;
       }
       public void setFixSelected(PayMethod method){
       paymethod=method;
       }
      
      
       @Destroy
       @Remove
       public void destroy() {
       AppUtils.LOG.fatal(" ================= PaymethodAction destroy");
       }
      }
      


      Exception Message
      org.jboss.seam.RequiredException: In attribute requires value for component: shop.cart.checkout.paymethod.shop.cart.checkout
       at org.jboss.seam.Component.getInstanceToInject(Component.java:1532)
       at org.jboss.seam.Component.injectFields(Component.java:1103)
       at org.jboss.seam.Component.inject(Component.java:846)
       at org.jboss.seam.interceptors.BijectionInterceptor.bijectTargetComponent(BijectionInterceptor.java:36)
       at sun.reflect.GeneratedMethodAccessor487.invoke(Unknown Source)
       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:16)
       at org.jboss.seam.interceptors.Interceptor.aroundInvoke(Interceptor.java:125)
       at org.jboss.seam.interceptors.SeamInvocationContext.proceed(SeamInvocationContext.java:61)
       at org.jboss.seam.interceptors.OutcomeInterceptor.interceptOutcome(OutcomeInterceptor.java:21)
       at sun.reflect.GeneratedMethodAccessor486.invoke(Unknown Source)
       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:16)
       at org.jboss.seam.interceptors.Interceptor.aroundInvoke(Interceptor.java:125)
       at org.jboss.seam.interceptors.SeamInvocationContext.proceed(SeamInvocationContext.java:61)
       at org.jboss.seam.interceptors.ConversationInterceptor.endOrBeginLongRunningConversation(ConversationInterceptor.java:58)
       at sun.reflect.GeneratedMethodAccessor485.invoke(Unknown Source)
       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:16)
       at org.jboss.seam.interceptors.Interceptor.aroundInvoke(Interceptor.java:125)
       at org.jboss.seam.interceptors.SeamInvocationContext.proceed(SeamInvocationContext.java:61)
       at org.jboss.seam.interceptors.BusinessProcessInterceptor.manageBusinessProcessContext(BusinessProcessInterceptor.java:58)
       at sun.reflect.GeneratedMethodAccessor484.invoke(Unknown Source)
       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:16)
       at org.jboss.seam.interceptors.Interceptor.aroundInvoke(Interceptor.java:125)
       at org.jboss.seam.interceptors.SeamInvocationContext.proceed(SeamInvocationContext.java:61)
       at com.itsolut.seam.interceptor.LoggedInInterceptor.checkLoggedIn(LoggedInInterceptor.java:44)
       at sun.reflect.GeneratedMethodAccessor595.invoke(Unknown Source)
       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:16)
       at org.jboss.seam.interceptors.Interceptor.aroundInvoke(Interceptor.java:125)
       at org.jboss.seam.interceptors.SeamInvocationContext.proceed(SeamInvocationContext.java:61)
       at org.jboss.seam.interceptors.ConversationalInterceptor.checkConversationForConversationalBean(ConversationalInterceptor.java:80)
       at sun.reflect.GeneratedMethodAccessor483.invoke(Unknown Source)
       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:16)
       at org.jboss.seam.interceptors.Interceptor.aroundInvoke(Interceptor.java:125)
       at org.jboss.seam.interceptors.SeamInvocationContext.proceed(SeamInvocationContext.java:61)
       at com.itsolut.seam.interceptor.UncaughtExceptionInterceptor.handleExceptions(UncaughtExceptionInterceptor.java:43)
       at sun.reflect.GeneratedMethodAccessor496.invoke(Unknown Source)
       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:16)
       at org.jboss.seam.interceptors.Interceptor.aroundInvoke(Interceptor.java:125)
       at org.jboss.seam.interceptors.SeamInvocationContext.proceed(SeamInvocationContext.java:61)
       at org.jboss.seam.interceptors.RollbackInterceptor.rollbackIfNecessary(RollbackInterceptor.java:30)
       at sun.reflect.GeneratedMethodAccessor482.invoke(Unknown Source)
       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:16)
       at org.jboss.seam.interceptors.Interceptor.aroundInvoke(Interceptor.java:125)
       at org.jboss.seam.interceptors.SeamInvocationContext.proceed(SeamInvocationContext.java:61)
       at org.jboss.seam.interceptors.RemoveInterceptor.removeIfNecessary(RemoveInterceptor.java:39)
       at sun.reflect.GeneratedMethodAccessor481.invoke(Unknown Source)
       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:16)
       at org.jboss.seam.interceptors.Interceptor.aroundInvoke(Interceptor.java:125)
       at org.jboss.seam.interceptors.SeamInvocationContext.proceed(SeamInvocationContext.java:61)
       at org.jboss.seam.interceptors.ExceptionInterceptor.handleExceptions(ExceptionInterceptor.java:44)
       at sun.reflect.GeneratedMethodAccessor480.invoke(Unknown Source)
       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:16)
       at org.jboss.seam.interceptors.Interceptor.aroundInvoke(Interceptor.java:125)
       at org.jboss.seam.interceptors.SeamInvocationContext.proceed(SeamInvocationContext.java:61)
       at org.jboss.seam.ejb.SeamInterceptor.invokeInContexts(SeamInterceptor.java:170)
       at org.jboss.seam.ejb.SeamInterceptor.invoke(SeamInterceptor.java:143)
       at org.jboss.seam.ejb.SeamInterceptor.aroundInvoke(SeamInterceptor.java:130)
       at sun.reflect.GeneratedMethodAccessor489.invoke(Unknown Source)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
       at java.lang.reflect.Method.invoke(Method.java:585)
       at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:118)
       at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63)
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
       at org.jboss.ejb3.entity.ExtendedPersistenceContextPropagationInterceptor.invoke(ExtendedPersistenceContextPropagationInterceptor.java:57)
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
       at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54)
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
       at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47)
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
       at org.jboss.aspects.tx.TxPolicy.invokeInCallerTx(TxPolicy.java:126)
       at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:201)
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
       at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
       at org.jboss.ejb3.stateful.StatefulInstanceInterceptor.invoke(StatefulInstanceInterceptor.java:81)
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
       at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:78)
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
       at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:47)
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
       at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
       at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
       at org.jboss.ejb3.stateful.StatefulContainer.localInvoke(StatefulContainer.java:188)
       at org.jboss.ejb3.stateful.StatefulLocalProxy.invoke(StatefulLocalProxy.java:98)
       at $Proxy295.start(Unknown Source)
       at com.itsolut.shop.actions.checkout.inf.IPaymethodAction$$FastClassByCGLIB$$5addc359.invoke(<generated>)
       at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
       at org.jboss.seam.interceptors.ClientSideInterceptor$1.proceed(ClientSideInterceptor.java:73)
       at org.jboss.seam.interceptors.SeamInvocationContext.proceed(SeamInvocationContext.java:54)
       at org.jboss.seam.ejb.SeamInterceptor.invokeInContexts(SeamInterceptor.java:170)
       at org.jboss.seam.ejb.SeamInterceptor.invoke(SeamInterceptor.java:143)
       at org.jboss.seam.ejb.SeamInterceptor.aroundInvoke(SeamInterceptor.java:130)
       at org.jboss.seam.interceptors.ClientSideInterceptor.interceptInvocation(ClientSideInterceptor.java:44)
       at org.jboss.seam.interceptors.ClientSideInterceptor.intercept(ClientSideInterceptor.java:38)
       at com.itsolut.shop.actions.checkout.inf.IPaymethodAction$$EnhancerByCGLIB$$141894e3.start(<generated>)
       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:16)
       at org.jboss.seam.util.Reflections.invokeAndWrap(Reflections.java:45)
       at org.jboss.seam.Component.callComponentMethod(Component.java:1476)
       at org.jboss.seam.Component.callCreateMethod(Component.java:1456)
       at org.jboss.seam.Component.newInstance(Component.java:1446)
       at org.jboss.seam.Component.getInstance(Component.java:1350)
       at org.jboss.seam.Component.getInstance(Component.java:1324)
       at org.jboss.seam.Component.getInstanceFromFactory(Component.java:1389)
       at org.jboss.seam.Component.getInstance(Component.java:1340)
       at org.jboss.seam.Component.getInstance(Component.java:1324)
       at org.jboss.seam.jsf.SeamVariableResolver.resolveVariable(SeamVariableResolver.java:44)
       at org.apache.myfaces.config.LastVariableResolverInChain.resolveVariable(LastVariableResolverInChain.java:42)
       at com.sun.facelets.el.LegacyELContext$LegacyELResolver.getValue(LegacyELContext.java:134)
       at com.sun.el.parser.AstIdentifier.getValue(AstIdentifier.java:65)
       at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:192)
       at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:71)
       at com.sun.facelets.el.LegacyValueBinding.getValue(LegacyValueBinding.java:56)
       at javax.faces.component.UIData.getValue(UIData.java:1019)
       at org.apache.myfaces.component.html.ext.HtmlDataTableHack.createDataModel(HtmlDataTableHack.java:433)
       at org.apache.myfaces.component.html.ext.HtmlDataTable.createDataModel(HtmlDataTable.java:741)
       at org.apache.myfaces.component.html.ext.HtmlDataTableHack.getDataModel(HtmlDataTableHack.java:410)
       at org.apache.myfaces.component.html.ext.HtmlDataTable.getDataModel(HtmlDataTable.java:734)
       at org.apache.myfaces.component.html.ext.HtmlDataTableHack.getRowCount(HtmlDataTableHack.java:84)
       at javax.faces.component.UIData.processColumnChildren(UIData.java:685)
       at javax.faces.component.UIData.processDecodes(UIData.java:581)
       at org.apache.myfaces.component.html.ext.HtmlDataTable.processDecodes(HtmlDataTable.java:276)
       at javax.faces.component.UIForm.processDecodes(UIForm.java:53)
       at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:602)
       at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:135)
       at org.apache.myfaces.lifecycle.LifecycleImpl.applyRequestValues(LifecycleImpl.java:219)
       at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:71)
       at javax.faces.webapp.FacesServlet.service(FacesServlet.java:137)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
       at com.itsolut.servlet.LoggingFilter.doFilter(LoggingFilter.java:30)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
       at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:144)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
       at org.jboss.seam.servlet.SeamExceptionFilter.doFilter(SeamExceptionFilter.java:45)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
       at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
       at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
       at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
       at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175)
       at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
       at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
       at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
       at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
       at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
       at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:199)
       at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:282)
       at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:754)
       at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:684)
       at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:876)
       at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
       at java.lang.Thread.run(Thread.java:595)
      


        • 1. Re: Name of @In Parameters
          ccanning

          I am new to seam, but I will try to answer the question. It appears that the ICheckoutAction is currently null. If it is allowed to be null, you should use (required=false). If you want Seam to create it, try (create=true). I think the exception prepends the name so you know which component is having the issue.

          • 2. Re: Name of @In Parameters

            thanks, that would make sense about the name. My next problem then is how is that component null. What I didn't show is that this is part of a pageflow and the first step in the pageflow setups the ICheckoutAction which I include below.

            I'm pretty sure that an exception was not thrown prior to the one above (I have a custom filter than emails me all exceptions). In fact, as part of the exception email, I dump the contents of the Seam contexts and found this component (first in list below) in the conversation context just like I expected it to be there:

            Conversation Context
             key[shop.cart.checkout] value[CheckoutAction:3j001-cgob78-euao51bl-1-eublwqzu-53]
             key[businessProcess] value[org.jboss.seam.core.BusinessProcess@1e04a34]
             key[shop.login] value[LoginAction:3j001-cgob78-euao51bl-1-eublwqzv-54]
             key[shop.register] value[RegisterAction:3j001-cgob78-euao51bl-1-eublwsh5-55]
             key[processRepository] value[com.itsolut.core.component.ProcessRepository@27b78e]
             key[em] value[ManagedPersistenceContext(java:/shopEntityManagerFactory)]
             key[shop.cart.checkout.verify] value[VerifyCartAction:3j001-cgob78-euao51bl-1-eubm2zea-5g]
             key[pageflow] value[Pageflow(default_2)]
             key[facesMessages] value[org.jboss.seam.core.FacesMessages@183d805]
             key[shop.cart.checkout.paymethod] value[PaymethodAction:3j001-cgob78-euao51bl-1-eublzabt-5b]
             key[billingAddresses] value[org.jboss.seam.jsf.ListDataModel@108e9aa]
             key[shop.cart.checkout.shipTo] value[ShipToAction:3j001-cgob78-euao51bl-1-eubm2ze4-5f]
             key[redirect] value[org.jboss.seam.core.Redirect@db5d26]
             key[conversation] value[org.jboss.seam.core.Conversation@1c0726f]
             key[shop.cart.checkout.billing.address] value[BillingAddressAction:3j001-cgob78-euao51bl-1-eubm209x-5e]
             key[shop.cart.checkout.authorize] value[AuthorizeCartAction:3j001-cgob78-euao51bl-1-eubm3srp-5h]
            


            So, if the component (first on the in the list), is in the conversation context, why is it not found?

            Thanks,
            Chris....

            
            @Stateful
            @Name("shop.cart.checkout")
            @Scope(ScopeType.CONVERSATION)
            @LoggedIn
            @HandleException
            public class CheckoutAction implements ICheckoutAction {
            
             @In(create = true)
             protected EntityManager em;
            
             @In(value="shop.login", create=true)
             private ILoginAction login;
            
             private Cart cart;
            
             @In(value="loggedInUser", scope=ScopeType.SESSION, required=false)
             private User user;
            
             @Begin(pageflow="checkout1")
             @SkipLoginCheck
             public String start(){
            
             AppUtils.LOG.fatal("======================================");
             AppUtils.LOG.fatal("========= STARTING ===================");
             AppUtils.LOG.fatal("======================================");
            
             AppUtils.LOG.fatal("=== start ==========");
             if(getCart().getCompany().isCheckoutSecure()){
             Contexts.getConversationContext().set("shop.checkout.secure.protocol", "TRUE");
             }
             return login.isLoggedIn() ? "loggedIn" : "loginRequired";
             }
            
            <snip code that I think is not relevant />
            
             @Destroy
             @Remove
             public void destroy() {
             AppUtils.LOG.fatal("=== destroy CheckoutAction =========");
             }
            }
            
            


            • 3. Re: Name of @In Parameters
              monkeyden

               

              "ccanning" wrote:
              If you want Seam to create it, try (create=true).


              I have been searching for some definition of the requirements for create=true to actually work. Is it simply the presence of a no-arg constructor? Does it have to be a SessionBean (i.e. something with an implicit create method)?

              • 4. Re: Name of @In Parameters
                pmuir

                There has to be a no-args constructor on a Seam component (probably annotated with @Name, though could be defined in components.xml) OR an @Factory for thhat value AFAIK