【问题标题】:how to pass DataTable var from jsf (primefaces) to managedBean?如何将 DataTable var 从 jsf(primefaces)传递给 managedBean?
【发布时间】:2014-05-19 21:54:52
【问题描述】:

我有一个带有作业列表的第一个 dataTable,对于列表中的每个作业,我不想使用 triggersList 创建第二个 dataTable(在第一个内部)这是我的 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>

所以对于每个作业变量我都不想有触发器列表,这是我的 managedBean:

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)

【问题讨论】:

  • 你有一个 triggerListMap 变量,它突然出现在你的 bean 中而没有事先声明。那显然不是你真正的豆子。请尝试发布经过测试的代码片段,并附上相关代码,并方便人们复制粘贴并尝试它们。请参阅SSCCE document

标签: java jsf-2 primefaces managed-bean


【解决方案1】:

最简单的方法是在 JobDetails 类中声明 triggerlist 并像这样使用它:

<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

【讨论】:

  • JobDetail类是我使用的Quartz Framework提供的问题。
  • 也许你可以用触发器列表在新的类中扩展 JobDetail 类。
  • 我刚刚找到了一个简单的解决方案。
【解决方案2】:

用 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());

}

【讨论】:

    猜你喜欢
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    相关资源
    最近更新 更多