Код переходит к неизвестному классу при выполнении метода в компоненте поддержки

У меня есть проблема, когда я вызываю метод в вспомогательном компоненте, который должен обновить список, после чего Rich: datagrid перерисовывается на моей странице xhtml, чтобы отразить изменения. С помощью отладки я могу подтвердить, что метод вызывается успешно, однако он выпрыгивает из метода после одной итерации по списку и переходит к другому классу (не к одному из моих классов). Он никогда не возвращается к методу, и сетка данных также никогда не перерисовывается.

Ниже приведен соответствующий код html и java. HTML:

<table width="650px">
    <tbody>
        <tr>
            <td width="325px" align="left"><h:outputText style="white-space: pre; font-weight: normal; font-family: Tahoma; font-size: 11px">Name :</h:outputText>
                <h:inputText id="searchName" size="25" value="#{myBean.searchName}"></h:inputText></td>
            <td width="325px" align="left"><h:outputText style="white-space: pre; font-weight: normal; font-family: Tahoma; font-size: 11px">Surname :</h:outputText>
                <h:inputText id="searchSurname" size="25" value="#{myBean.searchSurname}"></h:inputText></td>
        </tr>
        <tr>
            <td width="325px" align="left"><h:outputText style="white-space: pre; font-weight: normal; font-family: Tahoma; font-size: 11px">ID :</h:outputText>
                <h:inputText id="searchId" size="25" value="#{myBean.searchId}"></h:inputText></td>
            <td width="325px" align="left"><h:outputText style="white-space: pre; font-weight: normal; font-family: Tahoma; font-size: 11px">Status :</h:outputText>
                <h:inputText id="searchStatus" size="25" value="#{myBean.searchStatus}"></h:inputText></td>
        </tr>
        <tr>
            <td align="right"><a4j:commandButton action="#{myBean.searchRecords}" value="Search" render="dataList"></a4j:commandButton></td>
        </tr>
    </tbody>
</table>

Ява:

public void searchRecords(){
    if(dataList == null){
        dataList = searchList;
    }

    searchList = Collections.<ListObj>emptyList();

    for (ListObj obj : dataList) {
        if((obj.getName().contains(searchName)) | (obj.getSurname().contains(searchSurname)) | (obj.getIdNumber().contains(searchId)) | (obj.getStatus().equalsIgnoreCase(searchStatus))){
            searchList.add(obj);
        }
    }
}

Код переходит к неизвестному классу в searchList.add(obj). Я использую Apache MyFaces JSF 2.1, RichFace 4.3 и Java 1.6. Я думаю, что это может быть как-то связано с жизненным циклом JSF, поскольку мое понимание жизненного цикла сильно отсутствует, но я могу ошибаться по той же причине. Я сейчас читаю сообщение BalusC о жизненном цикле.


person Vinc    schedule 22.04.2013    source источник
comment
Можете ли вы сказать нам, как называется неизвестный класс и метод, который показывает ваш отладчик?   -  person Apurv    schedule 22.04.2013


Ответы (1)


Ваша исходная причина заключается в том, что вы пытаетесь добавить элементы в пустой список. Метод Collections.emptyList(); возвращает экземпляр специального внутреннего класса EmptyList, определенного в классе Collections. Этот специальный список не может быть изменен. Попытка добавить к нему элементы не изменит его содержимое.

Итак, измените строку searchList = Collections.<ListObj>emptyList(); на searchList = Collections.new ArrayList<ListObj>(); и повторите попытку.

person AlexR    schedule 22.04.2013
comment
Большое спасибо за этот ответ. Я понятия не имел, что он не просто возвращает пустой список ListObj. - person Vinc; 22.04.2013