Хорошо, я думаю, что понял это! Хитрость заключается в том, чтобы ваш индексированный геттер создавал элемент каждый раз, когда метод getPersons () вызывается методом populate объекта BeanUtils. Код еще не завершен, но я получил положительный результат. Сейчас 3:30, и я застрял на этом некоторое время. Казалось, никто не знает ответа, что заставляет меня хотеть ударить их по голове форелью. Что касается моего собственного невежества ... Я их только виню!
public List<Person> getPersons() {
persons.add(new Person()); // BeanUtils needs to know the list is large enough
return persons;
}
Конечно, добавьте и ваши индексированные геттеры и сеттеры.
Я помню, как я на самом деле сделал это. Вы должны предварительно инициализировать список лиц, указанный выше, до максимального размера, который вы планируете перевести. Это связано с тем, что сначала список преобразуется в массив, затем свойства устанавливаются для каждого элемента массива и, наконец, список отбрасывается с помощью setPersons (...). Следовательно, использование реализации отложенной загрузки List или аналогичного подхода (например, показанного выше) НЕ будет работать с живыми распорками. Вот что вам нужно сделать более подробно:
private List<Person> persons = new ArrayList<Person>(MAX_PEOPLE);
public MyConstructor() { for(int i = 0; i < MAX_PEOPLE; i++) persons.add(new Person()); }
public List<Person> getPeopleSubmitted() {
List<Person> copy = new ArrayList<Person>();
for(Person p : persons) {
if(p.getId() != null) copy.add(p);
// id will be set for the submitted elements;
// the others will have a null id
}
return copy; // only the submitted persons returned - not the blank templates
}
Это в основном то, что вы должны сделать! Но реальный вопрос - кто больше использует живые распорки?!