jsf - commandLink в таблице данных для удаления строки

Я хочу поместить h: commandLink в h: dataTable, чтобы удалить одну строку. Здесь у меня есть код, который не работает, и я надеюсь, что вы можете мне помочь. Этот код даже не вызывает мой метод удаления. Данные для h:dataTable поступают из базы данных.

XHTML

        <h:form>
            <div class="center">
                <h:dataTable id="list" value="#{firstBackingBean.list}"
                    var="first" styleClass="center">

                    <!-- other columns (take data from firstBackingBean) -->

                    <h:column>
                        <f:facet name="header" />
                        <h:commandLink value="delete" action="#{secondBackingBean.delete}" >
                            <f:ajax execute="@form" render="list" />
                            <f:param name="id" value="#{first.id}"/>
                        </h:commandLink>
                    </h:column>
                </h:dataTable>
            </div>
        </h:form>

FirstBackingBean

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class FirstBackingBean {
    public void delete() {
        System.out.println("\nBUTTON CLICKED\n");
    }
}

ВторойBackingBean

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class SecondBackingBean {
    // ...
}

person thomas.st    schedule 25.09.2012    source источник


Ответы (2)


Когда компонент UICommand внутри компонента UIData не вызывает свое действие, это часто означает, что модель, стоящая за атрибутом value компонента UIData, несовместимо изменилась между запросом на отображение формы с таблицей и последующим запросом на отправку форма.

Это может произойти, если компонент поддержки находится в области запроса, а модель предварительно инициализирована на основе переменной области запроса (например, параметра запроса), которая больше не присутствует во время запроса на отправку формы.

Размещение bean-компонента в области просмотра должно исправить это.

Смотрите также:

person BalusC    schedule 25.09.2012
comment
@ViewScoped не решает моих проблем. Что мне попробовать дальше? - person thomas.st; 25.09.2012
comment
@user1586660 user1586660 Прочитайте ссылки внутри и проверьте, есть ли у вас какие-либо из этих ошибок. - person Luiggi Mendoza; 25.09.2012
comment
@LuiggiMendoza У меня нет ошибок, и поэтому это так странно. Мой метод delete() просто никогда не вызывается. JBoss отображает все новые SELECT из базы данных, но не System.out.println() из моего метода. - person thomas.st; 25.09.2012
comment
@ user1586660 очистите все свои активы, затем создайте проект и повторите попытку. - person Luiggi Mendoza; 26.09.2012
comment
@LuiggiMendoza, это не решает проблему. Опять же, метод delete() не вызывается. Это действительно странно. - person thomas.st; 26.09.2012
comment
@user1586660 user1586660 вы пробовали использовать метод, отличный от вашего delete? Вы пытались просто отобразить параметр в своем методе удаления? Вы изолировали случай, чтобы проверить, есть ли проблема с использованием этого подхода или может быть другая проблема в вашем коде? Сказать, что это не работает, довольно расплывчато, и решение других потенциальных проблем в вашем коде выходит за рамки вопроса/ответа. Помните, что ссылки, предоставленные BalusC, очень информативны. - person Luiggi Mendoza; 26.09.2012
comment
@LuiggiMendoza Да, я пытался использовать другой метод. Но я даже не могу что-то напечататьln(). Без h: dataTable вызов метода работает, но когда я использую его в h: dataTable, он ничего не делает, просто выбирает. - person thomas.st; 26.09.2012
comment
@ user1586660 что-то не так с вашим <h:datatable>. Отредактируйте свой вопрос и опубликуйте полный код, чтобы проверить наличие ошибок. - person Luiggi Mendoza; 26.09.2012
comment
Покажите настоящий SSCCE вместо небрежно упрощенного и непроверенного фрагмента. Покажите bean-компонент с 1 свойством и 1 методом действия и представление с таблицей данных с 1 столбцом с командной ссылкой. Все остальные столбцы и свойства не имеют отношения к этой проблеме. Кстати, rowIndexVar вообще не существует на h:dataTable. - person BalusC; 26.09.2012
comment
Этот код не является полным. Я не могу скопировать и вставить и запустить его без внесения неочевидных изменений. Таблица остается пустой и жалуется, что свойство list не может быть найдено. Кроме того, метод delete(), похоже, находится в совершенно неправильном классе поддерживающего компонента. Еще раз, пожалуйста, предоставьте настоящий SSCCE. Нажмите на ссылку, если вы не понимаете, о чем я спрашивал. - person BalusC; 26.09.2012

У меня есть ответ!

У меня есть 2 BackingBean, первыйBackingBean нуждается в аннотации @SessionScoped, а второйBackingBean нуждается в аннотации @ViewScoped.

Большое спасибо за другие ответы.

person thomas.st    schedule 26.09.2012