Misunderstanding of how @In works.
c_eric_ray Jul 5, 2006 2:46 PMI'm doing the following and it's just not working for me. I think I don't quite understand how to use the @In annotation. Any suggestions? I apologize for the long post, but I wanted to show the right amount of information. Thanks.
Here's the error...
javax.faces.el.EvaluationException: /calculator.xhtml @42,132 action="#{calculate.calculate}": javax.ejb.EJBException: org.jboss.seam.RequiredException: In attribute requires value for component: calculate.cb
Code looks like this...
@Name("calculate") @Stateful public class CaclulateAction implements Calculate { @In(create=true) private CalculatorBean cb; @DataModel private List<CalculatorBean> cbList; public String calculate() { double tmp = Math.pow(1. + cb.getGrowthRate() / 12., 12. * (cb.getEnd() - cb.getStart()) + 1); double result = cb.getSaving() * 12. * (tmp - 1) / cb.getGrowthRate(); cb.setResult(result); cbList.add(cb); return "/calculator.jsf"; } }
simple bean to hold the data...
@Name("calculator") @Scope(ScopeType.CONVERSATION) public class CalculatorBean { getters/setters }
portion of calculator.xhtml file
<form id="calcform" name="calcform" method="post" jsfc="h:form"> <table jsfc="h:panelGrid" width="406" border="1" cellpadding="2"> <tr> <td width="140"><div align="right">Start Age </div></td> <td width="250"><input name="startage" type="text" id="startage" size="40" jsfc="h:inputText" value="#{calculator.start}"/></td> </tr> <tr> <td><div align="right">End Age </div></td> <td><input name="endage" type="text" id="endage" size="40" jsfc="h:inputText" value="#{calculator.end}" /></td> </tr> <tr> <td><div align="right">Growth Rate </div></td> <td><input name="growthrate" type="text" id="growthrate" size="40" jsfc="h:inputText" value="#{calculator.growthRate}" /></td> </tr> <tr> <td><div align="right">Monthly Savings </div></td> <td><input name="savings" type="text" id="savings" size="40" jsfc="h:inputText" value="#{calculator.saving}" /></td> </tr> <tr> <td><div align="right"></div></td> <td><table width="240" border="1"> <tr> <td><div align="left"> <input type="submit" jsfc="h:commandButton" id="submit" action="#{calculate.calculate}" name="Submit" value="Submit" /> </div></td> <td><div align="right"> <input name="reset" jsfc="h:commandButton" action="calculator.jsf" type="reset" id="reset" value="Reset" /> </div></td> </tr> </table></td> </tr> </table> </form>
config files and descriptors...
--- components.xml --- <components> <component name="org.jboss.seam.core.init"> <property name="jndiPattern">JsfCalculator/#{ejbName}/local</property> </component> <component class="org.jboss.seam.core.Ejb" installed="false" /> </components> --- faces-config.xml --- <faces-config> <application> <view-handler>com.sun.facelets.FaceletViewHandler</view-handler> </application> <!-- Phase listener needed for all Seam applications --> <lifecycle> <phase-listener> org.jboss.seam.jsf.SeamPhaseListener </phase-listener> </lifecycle> </faces-config> --- web.xml --- <!-- Faces Servlet --> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <!-- Faces Servlet Mappings --> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping> <!-- Seam --> <listener> <listener-class> org.jboss.seam.servlet.SeamListener </listener-class> </listener> <!-- MyFaces --> <listener> <listener-class> org.apache.myfaces.webapp.StartupServletContextListener </listener-class> </listener> <context-param> <param-name>javax.faces.STATE_SAVING_METHOD</param-name> <param-value>client</param-value> </context-param> <!-- Context Parameters --> <context-param> <param-name>javax.faces.DEFAULT_SUFFIX</param-name> <param-value>.xhtml</param-value> </context-param> <context-param> <param-name>facelets.DEVELOPMENT</param-name> <param-value>true</param-value> </context-param> <context-param> <description>Set this to true for strict JSF RI validation</description> <param-name>com.sun.faces.validateXml</param-name> <param-value>true</param-value> </context-param> <context-param> <description>Set this to true to have JSF RI verify all appliation objects</description> <param-name>com.sun.faces.verifyObjects</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>javax.faces.application.CONFIG_FILES</param-name> <param-value>/WEB-INF/faces-config.xml</param-value> </context-param> <!-- Faces Servlet Mapping --> <welcome-file-list> <welcome-file>calculator.jsf</welcome-file> </welcome-file-list> </web-app>