Jsf 数据表中的Primefaces子表不工作

Jsf 数据表中的Primefaces子表不工作,jsf,primefaces,datatable,Jsf,Primefaces,Datatable,我是jsf新手,在数据表中实现子表时遇到了一些问题。我的子表中的Der var atribute似乎没有对列表中的元素求值。另外,当我执行我的webapp并导航到xhtml站点时,也不会调用我的支持bean中的@PostConstruct方法。控制台中没有显示错误,所以我几乎不知道我做错了什么 支持Bean @Named(value = "selfEvalBean") @ViewScoped public class SelfEvaluationBean extends AbstractBean

我是jsf新手,在数据表中实现子表时遇到了一些问题。我的子表中的Der var atribute似乎没有对列表中的元素求值。另外,当我执行我的webapp并导航到xhtml站点时,也不会调用我的支持bean中的@PostConstruct方法。控制台中没有显示错误,所以我几乎不知道我做错了什么

支持Bean

@Named(value = "selfEvalBean")
@ViewScoped
public class SelfEvaluationBean extends AbstractBean implements Serializable {


private static final long serialVersionUID = 310401011219411386L;


private static final Logger logger = Logger.getLogger(SelfEvaluationBean.class);

@Inject
private ISelfEvaluationManager manager;


private List<SelfEvaluation> selfEvaluations;


private SelfEvaluationTopic topic;


public List<SelfEvaluation> getSelfEvaluations() {
    return selfEvaluations;
}


public void setSelfEvaluation(final List<SelfEvaluation> theSelfEvaluations) {
    selfEvaluations = theSelfEvaluations;
}


@PostConstruct
public void init() {
    if (!isLoggedIn()) {
        return;
    }
    final User user = getSession().getUser();
    List<SelfEvaluation> eval = user.getSelfEvaluations();
    if (eval == null) {
        eval = manager.createSelfEvaluation(user);
    }
    selfEvaluations = eval;
    topic = new SelfEvaluationTopic();
}

//some methods

/**
 * @return the topic
 */
public SelfEvaluationTopic getTopic() {
    return topic;
}

/**
 * @param theTopic
 */
public void setTopic(final SelfEvaluationTopic theTopic) {
    topic = theTopic;
}



}
XHTML站点

<?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://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core" 
  xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
  xmlns:p="http://primefaces.org/ui">

<ui:composition template="templates/template.xhtml"> 
    <!--header and footer template-->
    <ui:define name="content">
        <f:loadBundle basename="internationalization.selfEval" var="msg" />
        <h:form id="form">
            <p:growl id="info" autoUpdate="true"  />

            <p:dataTable id="selfEval" var="eval" value="#{selfEvalBean.selfEvaluations}" >
                <f:facet name="header">
                    #{msg['header']}
                </f:facet>
                <p:columnGroup type="header">
                    <p:row>
                        <p:column>
                            <f:facet name="header">#{msg['selfEval']}</f:facet>
                        </p:column>
                        <p:column width="2%">
                            <f:facet id="sad" name="header">
                                <p:graphicImage library="images" name="sad.png"/> 
                            </f:facet>
                        </p:column>
                        <p:column width="2%">
                            <f:facet id="sad" name="header">
                                <p:graphicImage library="images" name="normal.png"/> 
                            </f:facet>
                        </p:column>
                        <p:column width="2%">
                            <f:facet id="sad" name="header">
                                <p:graphicImage library="images" name="happy.png"/> 
                            </f:facet>
                        </p:column>
                    </p:row>                      
                </p:columnGroup>

                <p:subTable var="t" value="#{eval.topics}">
                    <f:facet name="header">
                        <h:outputText value="#{eval.title}" />
                    </f:facet>

                    <p:column id="topic" >
                        <h:outputText value="#{t}" /> <!--t is of type List<SelfEvaluation> and not SelfEvaluationTopic-->
                        <p:commandButton style="float:right; width:22px; height: 22px; background-color: #cd001e;" title="Delete" update=":form" action="#{selfEvalBean.remove(t)}" icon="fa fa-trash-o" />
                    </p:column>

                    <p:column width="2%" >
                        <div style="text-align: center;" >
                            <p:selectBooleanCheckbox id="s" value="#{t}"  />
                        </div>
                    </p:column>

                    <p:column width="2%"  >
                        <div style="text-align: center;" >
                            <p:selectBooleanCheckbox id="n" value="#{t}"  />
                        </div>
                    </p:column>

                    <p:column width="2%" >
                        <div style="text-align: center;" >
                            <p:selectBooleanCheckbox id="h" value="#{t}" />
                        </div>
                    </p:column>
                </p:subTable>
            </p:dataTable>

                <center>
                    <p:commandButton id="addSelfEvalTopic" styleClass="button" value="#{msg['actionAdd']}" onclick="PF('evalDialog').show();" update=":form" />
                    <p:commandButton id="selection" styleClass="button" style="float:right;" value="#{msg['actionSelect']}" action="#{selfEvalBean.save}" />
                </center>


        </h:form>
        <p:dialog widgetVar="evalDialog" header="#{msg['newTopic']}" showEffect="clip" hideEffect="clip" resizable="false">
            <h:form id="dialog">
                <h:panelGrid columns="2">
                    <p:outputLabel value="Description:" />
                    <p:inputText value="#{selfEvalBean.topic.topic}" required="true" maxlength="60" />

                    <p:commandButton value="#{msg['actionSave']}" styleClass="button"  action="#{selfEvalBean.addTopic}" update=":form" oncomplete="PF('evalDialog').hide();" />
                    <p:commandButton value="#{msg['actionCancel']}" styleClass="button"  immediate="true" oncomplete="PF('evalDialog').hide();" /> 
                </h:panelGrid>
            </h:form>
        </p:dialog>
    </ui:define>
</ui:composition>

#{msg['header']}
#{msg['selfEval']}

Manager类用一些初始数据填充数据库,因此没有什么真正有趣的事情发生。 JSF版本为2.2.12,PrimeFaces版本为6.0。
我正在使用Maven进行构建,webapp正在GlassFish 4.1.1上运行

您是否在CDI中使用焊接?删除
。嵌套表单不起作用!!我不明白为什么子表中有一个
列表
,或者为什么没有调用@PostConstruct方法。首先尝试删除嵌套表单。也许这有助于删除表单没有帮助:(用户类有一个列表,每个自评估对象都有自己的列表,我想展示每个自评估主题。每个自评估对象都应该有自己的子表。我发现这个表与primefaces的showcase中的表非常相似。我不明白这个问题。我稍后会尝试。@Glassfish 4.1.1中的JaqenH'ghar实际上应该有JSF的Mojarra实现2.2.13。
@Entity
public class SelfEvaluationTopic extends JPAEntity implements Serializable {

private static final long serialVersionUID = 1L;

@Column(nullable = false)
private String topic;

@Column
private boolean sad;

@Column
private boolean normal;

@Column
private boolean happy;


public String getTopic() {
    return topic;
}


public void setTopic(final String theTopic) {
    topic = assertNotNull(theTopic);
}


public boolean getSad() {
    return sad;
}


public void setSad(final boolean evaluation) {
    sad = evaluation;
}


public boolean getNormal() {
    return normal;
}


public void setNormal(final boolean evaluation) {
    normal = evaluation;
}


public boolean getHappy() {
    return happy;
}


public void setHappy(final boolean evaluation) {
    happy = evaluation;
}

@Override
public boolean equals(final Object theObject) {
    if (!(theObject instanceof SelfEvaluationTopic)) {
        return false;
    }
    final SelfEvaluationTopic other = (SelfEvaluationTopic) theObject;
    return getId().equals(other.getId());
}

@Override
public int hashCode() {
    return getId().hashCode();
}

@Override
public String toString() {
    return String
            .format("SelfEvaluationTopic {id: %d, topic: %s, sad: %b, normal: %b, happy: %b}",
                    getId(), topic, sad, normal, happy);
}

}
<?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://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core" 
  xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
  xmlns:p="http://primefaces.org/ui">

<ui:composition template="templates/template.xhtml"> 
    <!--header and footer template-->
    <ui:define name="content">
        <f:loadBundle basename="internationalization.selfEval" var="msg" />
        <h:form id="form">
            <p:growl id="info" autoUpdate="true"  />

            <p:dataTable id="selfEval" var="eval" value="#{selfEvalBean.selfEvaluations}" >
                <f:facet name="header">
                    #{msg['header']}
                </f:facet>
                <p:columnGroup type="header">
                    <p:row>
                        <p:column>
                            <f:facet name="header">#{msg['selfEval']}</f:facet>
                        </p:column>
                        <p:column width="2%">
                            <f:facet id="sad" name="header">
                                <p:graphicImage library="images" name="sad.png"/> 
                            </f:facet>
                        </p:column>
                        <p:column width="2%">
                            <f:facet id="sad" name="header">
                                <p:graphicImage library="images" name="normal.png"/> 
                            </f:facet>
                        </p:column>
                        <p:column width="2%">
                            <f:facet id="sad" name="header">
                                <p:graphicImage library="images" name="happy.png"/> 
                            </f:facet>
                        </p:column>
                    </p:row>                      
                </p:columnGroup>

                <p:subTable var="t" value="#{eval.topics}">
                    <f:facet name="header">
                        <h:outputText value="#{eval.title}" />
                    </f:facet>

                    <p:column id="topic" >
                        <h:outputText value="#{t}" /> <!--t is of type List<SelfEvaluation> and not SelfEvaluationTopic-->
                        <p:commandButton style="float:right; width:22px; height: 22px; background-color: #cd001e;" title="Delete" update=":form" action="#{selfEvalBean.remove(t)}" icon="fa fa-trash-o" />
                    </p:column>

                    <p:column width="2%" >
                        <div style="text-align: center;" >
                            <p:selectBooleanCheckbox id="s" value="#{t}"  />
                        </div>
                    </p:column>

                    <p:column width="2%"  >
                        <div style="text-align: center;" >
                            <p:selectBooleanCheckbox id="n" value="#{t}"  />
                        </div>
                    </p:column>

                    <p:column width="2%" >
                        <div style="text-align: center;" >
                            <p:selectBooleanCheckbox id="h" value="#{t}" />
                        </div>
                    </p:column>
                </p:subTable>
            </p:dataTable>

                <center>
                    <p:commandButton id="addSelfEvalTopic" styleClass="button" value="#{msg['actionAdd']}" onclick="PF('evalDialog').show();" update=":form" />
                    <p:commandButton id="selection" styleClass="button" style="float:right;" value="#{msg['actionSelect']}" action="#{selfEvalBean.save}" />
                </center>


        </h:form>
        <p:dialog widgetVar="evalDialog" header="#{msg['newTopic']}" showEffect="clip" hideEffect="clip" resizable="false">
            <h:form id="dialog">
                <h:panelGrid columns="2">
                    <p:outputLabel value="Description:" />
                    <p:inputText value="#{selfEvalBean.topic.topic}" required="true" maxlength="60" />

                    <p:commandButton value="#{msg['actionSave']}" styleClass="button"  action="#{selfEvalBean.addTopic}" update=":form" oncomplete="PF('evalDialog').hide();" />
                    <p:commandButton value="#{msg['actionCancel']}" styleClass="button"  immediate="true" oncomplete="PF('evalDialog').hide();" /> 
                </h:panelGrid>
            </h:form>
        </p:dialog>
    </ui:define>
</ui:composition>