Ну, я уже прочитал другие сообщения и не могу решить свою проблему. У меня есть привязка dataTable (JSF) в моем ManagedBean. У меня есть список выбранных элементов и я хочу удалить эти элементы, см:ConcurrentModificationException при попытке удалить элемент из списка
public void removeSelected() {
for (Map.Entry<Integer, Boolean> entry : registrosSelecionados.entrySet()){
if (entry.getValue() == true){
int id = entry.getKey();
Iterator<Bean> it = beans.iterator();
while(it.hasNext()){
Bean b = it.next();
if (b.getId().equals(id)){
setBean(b);
deletar();
}
}
}
}
}
Мой метод выше вызова другой метод с именем 'deletar(), см:
public void deletar() {
try {
//Se o bean for nulo então capturamos o bean selecionado no DataTable, se este existir
if (bean == null){
if (dataTable == null){
throw new RuntimeException("O bean é nulo e não há dataTable vinculado ao ManagedBean. A deleção será abortada");
}
bean = (Bean) dataTable.getRowData();
}
beforeRemove();
getBoPadrao().delete((AbstractBean) bean);
addInfoMessage("Registro deletado com sucesso");
beans.remove(bean);
bean = null;
afterRemove();
} catch (BOException e) {
addErrorMessage(e.getMessage());
FacesContext.getCurrentInstance().validationFailed();
} catch (Exception e) {
e.printStackTrace();
logger.error((new StringBuilder()).append("Erro ao deletar: ")
.append(e.getMessage()).toString());
FacesContext.getCurrentInstance().validationFailed();
addErrorMessage((new StringBuilder()).append("Erro ao deletar. ")
.append(e.getMessage()).toString());
}
}
Бин удаляется из База данных, но при попытке удалить из «списка» я получил ошибку:
Jan 31, 2015 5:38:32 PM com.sun.faces.context.AjaxExceptionHandlerImpl handlePartialResponseError
Grave: java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
at java.util.ArrayList$Itr.next(ArrayList.java:831)
at br.com.jwebbuild.mb.BasicCrudMBImpl.removeSelected(BasicCrudMBImpl.java:226)
рЕДАКТИРОВАТЬ 1
Я пытался отредактировать метод deletear(), поставив итератор для удаления элемента, но не работал, ошибка продолжается.
public void deletar() {
try {
//Se o bean for nulo então capturamos o bean selecionado no DataTable, se este existir
if (bean == null){
if (dataTable == null){
throw new RuntimeException("O bean é nulo e não há dataTable vinculado ao ManagedBean. A deleção será abortada");
}
bean = (Bean) dataTable.getRowData();
}
beforeRemove();
getBoPadrao().delete((AbstractBean) bean);
addInfoMessage("Registro deletado com sucesso");
Iterator<Bean> it = beans.iterator();
while (it.hasNext()) {
Bean b = it.next();
if (b.equals(bean)) {
it.remove();
}
}
bean = null;
afterRemove();
Это не относится к JSF в любом случае. Это Java SE. Вы не можете удалить элементы коллекции, итерации по этой коллекции. Функциональность включена вместо метода удаления итератора. В этом случае вы должны использовать метод удаления итератора. – Tiny
"* Обратите внимание, что Iterator.remove является единственным безопасным способом изменения коллекции во время итерации, поведение неуказано, если базовая коллекция модифицируется каким-либо другим способом, пока выполняется итерация. *" Http://docs.oracle .com/javase/tutorial/collections/interfaces/collection.html – Tiny