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]