как передать DataTable var из jsf (primefaces) в manageBean?

У меня есть первый dataTable со списком заданий, для каждого задания из списка я не хочу создавать второй dataTable (внутри первого) с triggersList, это моя страница jsf:

<p:dataTable id="jobs" var="job" value="#{jobBean.jobList}" rowKey="job.key">
    <f:facet name="header">  
            Jobs List 
    </f:facet>
<p:column headerText="Name">  
        #{job.key.name}   
    </p:column>
<p:column headerText="Group">  
        #{job.key.group}  
    </p:column>
    <p:column headerText="Triggers">
    <p:dataTable id="triggers" var="trigger" value="#{jobBean.triggerList}">
    <p:column headerText="Start Time">  
                #{trigger.startTime}   
        </p:column>
    </p:dataTable>
 </p:column>
 </p:dataTable>

Итак, для каждой переменной задания я не хочу иметь список триггеров, это мой manageBean:

public class JobBean implements Serializable {

    @ManagedProperty(value = "#{job}")
private JobDetail job;
    private List<Trigger> triggerList;

   ....


        /**
 * @param triggerList
 *            the triggerList to set
 */
public void setTriggerList(List<Trigger> triggerList) {
    this.triggerList = triggerList;
}

/**
 * @return the triggerList
 */
public List<Trigger> getTriggerList() {
    this.get();
    return triggerList;
}

private void get(){
    FacesContext ctx = FacesContext.getCurrentInstance();
    JobDetail jb = ctx.getApplication().evaluateExpressionGet(ctx, "# {job}", JobDetail.class);
    this.triggerList = triggerListMap.get(jb.getKey());
}



    /**
 * @param job
 *            the job to set
 */
public void setJob(JobDetail job) {
    this.job = job;
}

/**
 * @return the job
 */
public JobDetail getJob() {
    return job;
} 

}

Метод get() возвращает исключение нулевого указателя:

Вызвано: java.lang.NullPointerException в tti.frameworkBI.web.JobBean.get(JobBean.java:129)


person Kassandra    schedule 07.04.2014    source источник
comment
У вас есть переменная triggerListMap, которая внезапно появляется в вашем компоненте без предварительного объявления. Это, очевидно, не твоя настоящая фасоль. Пожалуйста, попробуйте опубликовать проверенные фрагменты кода с релевантным кодом и облегчите людям возможность копировать-вставлять и пробовать их. См. документ SSCCE.   -  person Xtreme Biker    schedule 08.04.2014


Ответы (2)


Самый простой способ — объявить список триггеров внутри класса JobDetails и использовать его следующим образом:

<p:dataTable id="jobs" var="job" value="#{jobBean.jobList}" rowKey="job.key">
      <f:facet name="header">  
                Jobs List 
        </f:facet>
<p:column headerText="Name">  
         #{job.key.name}   
     </p:column>
<p:column headerText="Group">  
         #{job.key.group}  
     </p:column>
<p:column headerText="Triggers">
     <p:dataTable id="triggers" var="trigger" value="#{job.triggerList}">
        <p:column headerText="Start Time">  
                    #{trigger.startTime}   
        </p:column>
     </p:dataTable>
</p:column>
     </p:dataTable> code here
person Raider    schedule 08.04.2014
comment
проблема в том, что класс JobDetail предоставляется Quartz Framework, который я использую. - person Kassandra; 08.04.2014
comment
Возможно, вы можете расширить класс JobDetail новым с помощью списка триггеров. - person Raider; 08.04.2014
comment
Я только что нашел простое решение. - person Kassandra; 10.04.2014

Решено с помощью findComponent и getRowData() :

public List<Trigger> getTriggerList() {
        this.get();
        return triggerList;
    }

private void get() {
    DataTable dataTable = (DataTable) FacesContext.getCurrentInstance()
            .getViewRoot().findComponent("form:jobs");
    JobDetail jb = (JobDetail) dataTable.getRowData();
    this.triggerList = this.jobServiceImpl.getAllTriggers(scheduler,
            jb.getKey());

}
person Kassandra    schedule 10.04.2014