Li, 

I think the issue is here is most likely point 3. When the form is submitted, I 
suspect struts is trying to call getListe(int) to retrieve a Personne bean 
before calling the respective setters.

So in this case, Dominque probably just needs an additional getter in the 
action form that will return the required bean:

public Personne  getListe(int i) {
        return (Personne) liste[i];
}

Peter.

-----Original Message-----
From: Li Ying [mailto:liying.cn.2...@gmail.com] 
Sent: Saturday, 27 November 2010 7:28 PM
To: Struts Users Mailing List
Subject: Re: javax.servlet.ServletException: BeanUtils.populate

I think the reason of the Exception maybe:

(1)the data you post is named like "liste[0].nom"

(2)Struts1 accept this http param, and try to translate it to a form property, 
by using a lib named Apache Commons BeanUtils
See: http://commons.apache.org/beanutils/

(3)BeanUtils treats nested property access likes "liste[0].nom"
as some chained java method invokes, like:
targetBean.getListe[0].setNome(someValue)

(4-1)If you did not initialize the array liste, it will be a null, so of cause 
"getListe" will get a null, and then, "getListe[0]" should throw a 
NullPointException

(4-2)If you initialized the array, but there is no item in it, then 
"getListe[0]" should throw an IndexOutOfBoundsException

(4-3)If you initialized the array, but the items in it is null, then 
"getListe[0]" will get a null, and then "setNome(someValue)" should  throw a 
NullPointException

So, you should initialize the array, and items in it, before you can capture 
data posted from client side.

Years ago, I meet the same problem. But I used List instead of array.
So I created a new class named "AutoList". When you call the "get(index)" 
method on it, it will create a new item instance if the item dose not exist yet.
By using this AutoList, when BeanUtils try to invoke method likes 
"getListe(0).setNome(someValue)", the item instance will be created 
automatically if need.

In your case, my suggest is:
(1)use AutoList, instead of Array

Or

(2)Since you have done the array/item initialization in the the method 
"setNom(int index , Personne nom)", so you can use this method instead of 
"getListe[0].setNome(someValue)".
Which mean, in html side, the data name should be "nom[0]" instead of 
"liste[0].nom"



How ever, I recommend AutoList solution strongly, because I believe this is a 
very common problem in Struts1.
You may meet it somewhere else, so AutoList class will be very convenient.
And also, if you use AutoList, you don't have to change the data name on the 
html side, which means, you can use struts tag lib as normal.

If you need this AutoList class, I can send it to you.

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
For additional commands, e-mail: user-h...@struts.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
For additional commands, e-mail: user-h...@struts.apache.org

Reply via email to