Редактируемая таблица данных + NoRowAvailableException

Я получаю это javax.faces.model.NoRowAvailableException, и я предполагаю, что это связано с областью действия компонента или с атрибутом идентификатора метаданных. Исключение возникает, когда я отправляю изменения строки (кнопка проверки p: rowEditor).

jsf-страница:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:p="http://primefaces.org/ui">
    <f:metadata>
        <f:viewParam name="id" value="#{definitionsFacelet.id}"/>
        <f:event type="preRenderView" listener="#{definitionsFacelet.init}" />
    </f:metadata>
    <h:head>
    <title>#{definitionsFacelet.plan.name}</title>
    </h:head>
    <h:body>
        <h1><h:outputText value="#{definitionsFacelet.plan.name}"/></h1>
        <f:view>
            <h:form>
                <h:messages class="errorMessage" id="defsMessages" />
                <p:dataTable value="#{definitionsFacelet.plan.definitions}" var="item" editable="true">
                    <p:ajax event="rowEdit" listener="#{definitionsFacelet.onEditDefinition}" update="@form:defsMessages" />
                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="Resource"/>
                        </f:facet>
                        <h:outputText value="#{item.resource.name}"/>
                    </p:column>
                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="Value"/>
                        </f:facet>
                        <p:cellEditor>
                            <f:facet name="output">  
                                <h:outputText value="#{item.value}"/>
                            </f:facet>
                            <f:facet name="input">  
                                <h:inputText value="#{item.value}"/>
                            </f:facet>
                        </p:cellEditor>
                    </p:column>
                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="Price"/>
                        </f:facet>
                        <p:cellEditor>
                            <f:facet name="output">  
                                <h:outputText value="#{item.price}"/>
                            </f:facet>
                            <f:facet name="input">  
                                <h:inputText value="#{item.price}"/>
                            </f:facet>
                        </p:cellEditor>
                    </p:column>
                    <p:column width="6%">
                        <f:facet name="header">
                            <h:outputText value="Edit"/>
                        </f:facet>
                        <p:rowEditor/>
                    </p:column>
                </p:dataTable>
            </h:form>
        </f:view>
    </h:body>
</html>

и управляемый компонент:

/**
 *
 * @author oliver
 */
package XXX;

import java.io.Serializable;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import XXX.DefinitionsControlInterface;
import XXX.PlansControlInterface;
import net.elegit.store.model.Plan;
import org.primefaces.event.RowEditEvent;

@ManagedBean
@RequestScoped
public class DefinitionsFacelet implements Serializable {

@EJB
DefinitionsControlInterface definitionsBean;

@EJB
PlansControlInterface planBean;

@ManagedProperty("#{param.id}")
private int id;

private Plan plan;

public void init(){
    System.out.println("ID: "+id);
    plan = planBean.get(id);
}

public String onEditDefinition(RowEditEvent event) {
    return null;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public Plan getPlan() {
    return plan;
}

public void setPlan(Plan plan) {
    this.plan = plan;
}

}

Эта проблема выглядит как проблема в Jsf DataModel vs Java List проблема (нет доступного исключения строки), но только ответ мне не помог.

С уважением, Оливер


person Oliver    schedule 05.05.2014    source источник
comment
когда я пытаюсь изменить область действия bean-компонента с Requesto на ViewScoped, возникает следующая ошибка: Unable to create managed bean definitionsFacelet. The following problems were found: - The scope of the object referenced by expression #{param.id}, request, is shorter than the referring managed beans (definitionsFacelet) scope of view Такое поведение кажется мне нормальным, поскольку параметр id существует только тогда, когда запрашивается страница, но значение не сохраняется контейнером.   -  person Oliver    schedule 05.05.2014
comment
Вы не можете внедрить компонент/объект в другой компонент более узкой области. param находится в области запроса, что означает, что вы можете внедрить его только в bean-компонент @SessionScoped. Это не значит, что вы должны делать свой боб @SessionScoped   -  person kolossus    schedule 05.05.2014
comment
Вы пробовали с другой областью действия, а не с RequestScoped? Можете ли вы попробовать @SessionScoped, чтобы увидеть, сохраняется ли проблема?   -  person Mateus Viccari    schedule 20.04.2015