Yes, except for 2 minor differences, I'm using an array[] instead of an ArrayList, and their the same bean, with two different actions, sorta like the following:
public class PropertyEditAction extends Action { //Load, Display, and save one Property } public class PropertyListAction extends Action { //Load, Display, and Save list of beans all at once } public class Property extends ActionForm { private String blahItem; private Property[] propertyList; public Property() { blahItem = null; propertyList = null; } public String getBlahItem(){return blahItem;} public void setBlahItem(String tempItem){blahItem = tempItem;} public Property getPropertyList(int i) { return propertyList[i]; } public void setPropertyList(Property[] properties) { propertyList = properties; } public void setPropertyList(int i, Property property) { propertyList[i] = property; } } -----Original Message----- From: Mark Lowe [mailto:[EMAIL PROTECTED] Sent: Wednesday, January 14, 2004 9:58 AM To: Struts Users Mailing List Subject: Re: BeanUtils.populate Invocation Error So have you something like this? public class PropertyEditForm extends ActionForm { //bla bla } public class PropertyListForm extends ActionForm { private ArrayList propertyList; public PropertyListForm() { this.propertyList = new ArrayList(); } public PropertyEditForm getProperty(int i) { return (PropertyEditForm) propertyList.get(i); } public void setProperties(Object[] properties) { .. } public void setProperty(int i, PropertyEditForm property) { propertyList.add(i, property); } } On 14 Jan 2004, at 14:38, Nathan Ewing wrote: > Basically all I have is 1 form bean that includes 2 arrays of itself > in it. > > When the app runs it gets 2 lists of the different categories of > SoldProperty and makes a jsp form that allows you to change certain > details > of the beans all at once, and then if you click on one of the beans > you can > edit them individually. > > There are actually two actions, one is PropertyList, which only loads > and > manages those two arrays of beans, and then there is PropertyEdit, > which > works on an individual bean, and ignores the two lists. > > I hope this makes sense. > > The code I posted below is a shortcut I put in all my beans. I > overrode > ActionForm and put a couple extra functions in. One of them > automatically > resets all the variables in the bean for me without having to manually > write > a reset function for every bean to do the same thing. > > The other changes the way validate works. Instead of 1 function that > does > all the validating, I write individual validateAttributeName() > functions and > the code below just calls all of them for me. Of course none of the > validate code matters, cause I didn't call it here (which makes me > wonder > why I bothered to post it). > > Somehow I doubt you are stupid :) > > I hope I didn't make all this sounds more complicated than it is. All > I > really wanna do is allow the users of my site to check a bunch of > checkboxes > all at once for multiple records instead of opening them all > individually. > > Thanks, > Nathan > > > > -----Original Message----- > From: Mark Lowe [mailto:[EMAIL PROTECTED] > Sent: Wednesday, January 14, 2004 9:17 AM > To: Struts Users Mailing List > Subject: Re: BeanUtils.populate Invocation Error > > Looks complicated what are you trying to do? Sorry I'm pretty stupid > and so i try and keep things simpler. > > > On 14 Jan 2004, at 13:55, Nathan Ewing wrote: > >> I posted much of the form bean code at the bottom. Aside for the two >> arrays >> of SoldProperty, there are a bunch of getString and setString. This >> is part >> of the bean SoldProperty (aka there are two arrays of SoldProperty in >> the >> SoldProperty bean). >> >> I altered the validate code and reset code so that it does the >> validating >> and resetting for me, as follows: >> >> If there is anything else you need please let me know. >> >> Nathan >> -------------------------------------------------------------------- >> >> public ActionErrors validate(ActionMapping mapping, >> HttpServletRequest request, String[] propertyList) { >> //Reset errors >> errors = new ActionErrors(); >> >> >> ClassManager manager = new ClassManager (this); >> for (int a = 0; a < propertyList.length; a++){ >> try { >> String methodName = "validate" + >> propertyList[a]; >> manager.runNoArgMethod(methodName); >> >> } catch (NoSuchMethodException e){ >> //Method Doesn't exist, Don't worry >> about it >> } catch (IllegalAccessException e){ >> } catch >> (java.lang.reflect.InvocationTargetException e){} >> >> } >> return errors; >> >> } >> >> public void reset(ActionMapping mapping, HttpServletRequest request) >> { >> ClassManager manager = new ClassManager (this); >> for (int a = 0; a < DataMembers.length; a++){ >> try { >> String methodName = "set" + DataMembers[a]; >> Class[] argTypes = {String.class}; >> Object[] args = {null}; >> manager.runMethod(methodName, argTypes, >> args); >> >> } catch (NoSuchMethodException e){ >> //Method Doesn't exist, Don't worry >> about it >> } catch (IllegalAccessException e){ >> } catch >> (java.lang.reflect.InvocationTargetException e){} >> >> } >> >> } >> >> >> -----Original Message----- >> From: Mark Lowe [mailto:[EMAIL PROTECTED] >> Sent: Wednesday, January 14, 2004 4:12 AM >> To: Struts Users Mailing List >> Subject: Re: BeanUtils.populate Invocation Error >> >> I had a similar problem yesterday with multiple selected select menus. >> What does your form bean look like and then your nested beans. >> >> >> >> On 14 Jan 2004, at 03:57, Nathan Ewing wrote: >> >>> I have a jsp page with a form on it using indexed properties. I have >>> a bean >>> with an array of beans that I use to connect with the jsp page. The >>> page >>> displays fine, but when I try to save it, I get the following error: >>> >>> javax.servlet.ServletException: BeanUtils.populate >>> at >>> org.apache.struts.util.RequestUtils.populate(RequestUtils.java:1254) >>> at >>> org.apache.struts.action.RequestProcessor.processPopulate(RequestProc >>> e >>> s >>> sor.j >>> ava:821) >>> at >>> org.apache.struts.action.RequestProcessor.process(RequestProcessor.ja >>> v >>> a >>> :254) >>> at >>> org.apache.struts.action.ActionServlet.process(ActionServlet.java: >>> 1482) >>> at >>> org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525) >>> at javax.servlet.http.HttpServlet.service(HttpServlet.java:760) >>> at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) >>> at >>> org.apache.catalina.core.StandardWrapperValve.invokeServletService(St >>> a >>> n >>> dardW >>> rapperValve.java:720) >>> at >>> org.apache.catalina.core.StandardWrapperValve.access$000(StandardWrap >>> p >>> e >>> rValv >>> e.java:118) >>> at >>> org.apache.catalina.core.StandardWrapperValve$1.run(StandardWrapperVa >>> l >>> v >>> e.jav >>> a:278) >>> at java.security.AccessController.doPrivileged(Native Method) >>> at >>> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV >>> a >>> l >>> ve.ja >>> va:274) >>> at >>> org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav >>> a >>> : >>> 505) >>> at >>> org.apache.catalina.core.StandardContextValve.invoke(StandardContextV >>> a >>> l >>> ve.ja >>> va:212) >>> at >>> org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav >>> a >>> : >>> 505) >>> at >>> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j >>> a >>> v >>> a:203 >>> ) >>> at >>> org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav >>> a >>> : >>> 505) >>> at >>> com.iplanet.ias.web.connector.nsapi.NSAPIProcessor.process(NSAPIProce >>> s >>> s >>> or.ja >>> va:157) >>> at com.iplanet.ias.web.WebContainer.service(WebContainer.java:598) >>> >>> >>> Root Cause >>> >>> java.lang.reflect.InvocationTargetException >>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >>> at >>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. >>> j >>> a >>> va:39 >>> ) >>> at >>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces >>> s >>> o >>> rImpl >>> .java:25) >>> at java.lang.reflect.Method.invoke(Method.java:324) >>> at >>> org.apache.commons.beanutils.PropertyUtils.getIndexedProperty(Propert >>> y >>> U >>> tils. >>> java:493) >>> at >>> org.apache.commons.beanutils.PropertyUtils.getIndexedProperty(Propert >>> y >>> U >>> tils. >>> java:428) >>> at >>> org.apache.commons.beanutils.PropertyUtils.getNestedProperty(Property >>> U >>> t >>> ils.j >>> ava:770) >>> at >>> org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils. >>> j >>> a >>> va:80 >>> 1) >>> at >>> org.apache.commons.beanutils.BeanUtils.setProperty(BeanUtils.java: >>> 881) >>> at >>> org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:808) >>> at >>> org.apache.struts.util.RequestUtils.populate(RequestUtils.java:1252) >>> at >>> org.apache.struts.action.RequestProcessor.processPopulate(RequestProc >>> e >>> s >>> sor.j >>> ava:821) >>> at >>> org.apache.struts.action.RequestProcessor.process(RequestProcessor.ja >>> v >>> a >>> :254) >>> at >>> org.apache.struts.action.ActionServlet.process(ActionServlet.java: >>> 1482) >>> at >>> org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525) >>> at javax.servlet.http.HttpServlet.service(HttpServlet.java:760) >>> at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) >>> at >>> org.apache.catalina.core.StandardWrapperValve.invokeServletService(St >>> a >>> n >>> dardW >>> rapperValve.java:720) >>> at >>> org.apache.catalina.core.StandardWrapperValve.access$000(StandardWrap >>> p >>> e >>> rValv >>> e.java:118) >>> at >>> org.apache.catalina.core.StandardWrapperValve$1.run(StandardWrapperVa >>> l >>> v >>> e.jav >>> a:278) >>> at java.security.AccessController.doPrivileged(Native Method) >>> at >>> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV >>> a >>> l >>> ve.ja >>> va:274) >>> at >>> org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav >>> a >>> : >>> 505) >>> at >>> org.apache.catalina.core.StandardContextValve.invoke(StandardContextV >>> a >>> l >>> ve.ja >>> va:212) >>> at >>> org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav >>> a >>> : >>> 505) >>> at >>> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j >>> a >>> v >>> a:203 >>> ) >>> at >>> org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav >>> a >>> : >>> 505) >>> at >>> com.iplanet.ias.web.connector.nsapi.NSAPIProcessor.process(NSAPIProce >>> s >>> s >>> or.ja >>> va:157) >>> at com.iplanet.ias.web.WebContainer.service(WebContainer.java:598) >>> Caused by: java.lang.NullPointerException >>> at >>> com.mysite.bean.SoldProperty.getExclusiveSold(SoldProperty.java:573) >>> >>> >>> Here is the relevant code: >>> >>> >>> protected SoldProperty[] ExclusiveSold; >>> protected SoldProperty[] BuyerSold; >>> >>> /** >>> Set the Value of ExclusiveSold to ExclusiveSoldValue >>> >>> @param ExclusiveSoldValue The value of the variable ExclusiveSold >>> in the Object >>> */ >>> public void setExclusiveSold (SoldProperty[] ExclusiveSoldValue) { >>> ExclusiveSold = ExclusiveSoldValue; >>> } >>> /** >>> Get the Value of ExclusiveSold >>> >>> @return The Value of ExclusiveSold >>> */ >>> public SoldProperty[] getExclusiveSold (){ >>> return ExclusiveSold; >>> } >>> >>> /** >>> Set the Value of ExclusiveSold to ExclusiveSoldValue >>> >>> @param ExclusiveSoldValue The value of the variable ExclusiveSold >>> in the Object >>> */ >>> public void setExclusiveSold (int index, SoldProperty >>> ExclusiveSoldValue) { >>> ExclusiveSold[index] = ExclusiveSoldValue; >>> } >>> /** >>> Get the Value of ExclusiveSold >>> >>> @return The Value of ExclusiveSold >>> */ >>> public SoldProperty getExclusiveSold (int index){ >>> return ExclusiveSold[index]; >>> } >>> >>> >>> /** >>> Set the Value of BuyerSold to BuyerSoldValue >>> >>> @param BuyerSoldValue The value of the variable BuyerSold in the >>> Object >>> */ >>> public void setBuyerSold (SoldProperty[] BuyerSoldValue) { >>> BuyerSold = BuyerSoldValue; >>> } >>> /** >>> Get the Value of BuyerSold >>> >>> @return The Value of BuyerSold >>> */ >>> public SoldProperty[] getBuyerSold (){ >>> return BuyerSold; >>> } >>> >>> /** >>> Set the Value of BuyerSold to BuyerSoldValue >>> >>> @param BuyerSoldValue The value of the variable BuyerSold in the >>> Object >>> */ >>> public void setBuyerSold (int index, SoldProperty BuyerSoldValue) { >>> BuyerSold[index] = BuyerSoldValue; >>> } >>> /** >>> Get the Value of BuyerSold >>> >>> @return The Value of BuyerSold >>> */ >>> public SoldProperty getBuyerSold (int index){ >>> return BuyerSold[index]; >>> } >>> >>> And the jsp code: >>> >>> <c:forEach var="exclusive" items="${SoldProperty.exclusiveSold}" >>> varStatus="status"> >>> <tr> >>> <td bgcolor="#E0E8F5" align="center"><c:out >>> value="${exclusive.soldDate}"/></td> >>> <td bgcolor="#E0E8F5"><html-el:hidden >>> property="exclusiveSold[${status.index}].soldId"/><a >>> href="Marketing.app?action=edit&id=<c:out >>> value="${exclusive.mlsNumber}"/>"><c:out >>> value="${exclusive.streetNumber}"/> >>> <c:out value="${exclusive.street}"/> <c:out >>> value="${exclusive.aptNumber}"/></a></td> >>> <td bgcolor="#E0E8F5" align="center"><c:out >>> value="${exclusive.price}"/></td> >>> <td bgcolor="#E0E8F5" >>> align="center"><html-el:checkbox >>> property="exclusiveSold[${status.index}].showListing" /></td> >>> <td bgcolor="#E0E8F5" >>> align="center"><html-el:checkbox >>> property="exclusiveSold[${status.index}].showPrice" /></td> >>> <td bgcolor="#E0E8F5" >>> align="center"><html-el:checkbox >>> property="exclusiveSold[${status.index}].showAptNumber" /></td> >>> <td bgcolor="#E0E8F5" align="center"><html-el:text >>> property="exclusiveSold[${status.index}].displayPrice" size="8" >>> /></td> >>> </tr> >>> </c:forEach> >>> >>> >>> <c:forEach var="buyer" items="${SoldProperty.buyerSold}" >>> varStatus="status"> >>> <tr> >>> <td bgcolor="#E0E8F5" align="center"><c:out >>> value="${buyer.soldDate}"/></td> >>> <td bgcolor="#E0E8F5"><html-el:hidden >>> property="buyerSold[${status.index}].soldId"/><a >>> href="soldProperty.app?action=edit&id=<c:out >>> value="${buyer.soldId}"/>"><c:out value="${buyer.streetNumber}"/> >>> <c:out >>> value="${buyer.street}"/> <c:out >>> value="${buyer.aptNumber}"/></a></td> >>> <td bgcolor="#E0E8F5" align="center"><c:out >>> value="${buyer.price}"/></td> >>> <td bgcolor="#E0E8F5" >>> align="center"><html-el:checkbox >>> property="buyerSold[${status.index}].showListing" /></td> >>> <td bgcolor="#E0E8F5" >>> align="center"><html-el:checkbox >>> property="buyerSold[${status.index}].showPrice" /></td> >>> <td bgcolor="#E0E8F5" >>> align="center"><html-el:checkbox >>> property="buyerSold[${status.index}].showAptNumber" /></td> >>> <td bgcolor="#E0E8F5" align="center"><html-el:text >>> property="buyerSold[${status.index}].displayPrice" size="8" /></td> >>> </tr> >>> </c:forEach> >>> >>> >>> >>> Any ideas why I'm getting this error? And how to fix it? >>> >>> Thanks, >>> Nathan Ewing >>> >>> >>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: [EMAIL PROTECTED] >>> For additional commands, e-mail: [EMAIL PROTECTED] >>> >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [EMAIL PROTECTED] >> For additional commands, e-mail: [EMAIL PROTECTED] >> >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [EMAIL PROTECTED] >> For additional commands, e-mail: [EMAIL PROTECTED] >> > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]