Jsf p:accordionPanel选项卡标题未显示

Jsf p:accordionPanel选项卡标题未显示,jsf,primefaces,accordion,title,Jsf,Primefaces,Accordion,Title,在我的JSF2.2应用程序中有一个动态手风琴面板,它从一个命名bean中获取其值。比如说 <p:accordionPanel id="formsPanel" value="#{formController.forms}" var="form" rendered="#{not empty formController.forms}"> <p:tab title="#{form.name}"> </p:tab>

在我的JSF2.2应用程序中有一个动态手风琴面板,它从一个命名bean中获取其值。比如说

    <p:accordionPanel id="formsPanel" value="#{formController.forms}" var="form"
        rendered="#{not empty formController.forms}">
        <p:tab title="#{form.name}">
        </p:tab>
    </p:accordionPanel>
表单是一种小部件

@Named
public class Widget
{
    protected String name;

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

     //Other stuff
}
你看不出有什么特别的形式

@Named
public class Form extends Widget
{
    //Form related code
}
有了这些,我不明白为什么
没有在选项卡的标题中显示表单的名称

我还尝试将accordion面板中的var名称从
表单
更改为
formInstance
,但这没有帮助,我还从
表单
类和
小部件
类中删除了
@Named

如果我在调试模式下启动服务器并在createForm方法中放置断点,我可以看到
FormController
form实例成员的名称确实为null

那么为什么
不能正确设置表单的名称呢

编辑:

我已经成功创建了一个SSCCE

这是XHTML

<!DOCTYPE html>
<html xmlns="http://www.w3c.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:p="http://primefaces.org/ui">
<h:head>
    <title>Forms</title>
</h:head>
<h:body>
    <p:accordionPanel id="formsPanel" value="#{formController.forms}"
        var="formInstance" rendered="#{not empty formController.forms}">
        <p:tab title="#{formInstance.name}">
        </p:tab>
    </p:accordionPanel>
    <p:accordionPanel rendered="#{not empty formController.forms}">
        <p:tab title="Add form">
            <h:form id="addFormForm1">
                <p:panelGrid columns="3" layout="grid">
                    <h:outputLabel value="Form name:" />
                    <p:inputText value="#{formController.form.name}" required="true"
                        label="text" />
                    <p:commandButton update="formsPanel"
                        action="#{formController.createForm}" value="Add form" />
                </p:panelGrid>
            </h:form>
        </p:tab>
    </p:accordionPanel>
</h:body>
</html>
FormController

@Named
@ViewScoped
public class FormController
{

    private FormService formService;

    private List<Form> forms;

    public Form form = new Form();

    @PostConstruct
    public void init()
    {
        formService = FormService.INSTANCE;
        forms = formService.findAll();
    }

    public void createForm()
    {
        formService.createForm(form);
        form = new Form();
    }

    public List<Form> getForms()
    {
        return forms;
    }

    public void setForms(List<Form> forms)
    {
        this.forms = forms;
    }

    public Form getForm()
    {
        return form;
    }

    public void setForm(Form form)
    {
        this.form = form;
    }

}
正如您在下面的屏幕截图中所看到的,初始化时使用的初始表单显示为ok,但添加带有名称的表单只会显示一个没有标题的新选项卡

我所做的是在Form.setName和FormController.createForm中放置两个断点

键入表单名称并单击“添加表单”时,将调用这两个方法

首先,使用表单对象引用(例如)com.test调用setForm。Form@30998fa6它的名字是正确的

然后使用表单对象引用com.test调用createForm。Form@2ad84d0f并且名称为空。我不明白为什么这是两个不同形式的物体


另一个症状是@PostConstruct被多次调用,而不是一次调用。

好的,再深入一点,我找到了答案。这有帮助

当我切换到使用
@ManagedBean
时,它开始工作。我不确定的是我使用的是Glassfish 4,我的POM中有以下依赖项

    <dependency>
        <groupId>javax.faces</groupId>
        <artifactId>javax.faces-api</artifactId>
        <version>2.2</version>
        <scope>provided</scope>
    </dependency>

javax.faces
javax.faces-api
2.2
假如

因此,我觉得我在使用JSF2.2,那么当您使用javax.faces.bean.ViewScoped use'@ManagedBean时,为什么这不能与
@Named
一起工作呢。当您使用import javax.faces.view.ViewScoped时,请使用此处提到的'@Named

我认为您的名称冲突。var是“form”,但由于
@Named
注释,它同时是托管cdibean的名称。如果从列表中访问表单,则最有可能不需要后者。尝试将var重命名为
formInstance
,但无效。尽管如此,请从实体类中删除
@Named
。它不属于那里。你在标签标题中也重命名了它吗?我希望你没有。我有。是的,我现在也从表单中删除了
@Named
,这取决于你是导入javax.faces.bean.viewscope还是导入javax.faces.view.viewscope。另外,如果classpath中有所有CDI JAR,那么这并不是真正问题的解决方案,但是因为您的问题仍然不是,所以很难找到原因。而且
@Named
是CDI而不是JSF。如果@Named不起作用,你一定会犯很多不同的错误,所以我认为它起作用了…@Kukeltje,你知道吗,让你自己冷静下来。它是可验证的@Mahendran它是一个faces bean。还使用glassfish,其中焊接cdi依赖项为provided@PaulStatham我想这就是它不起作用的原因。当您使用javax.faces.bean.ViewScoped时,请使用“@ManagedBean”。当您使用import javax.faces.view.ViewScoped使用此处提到的'@命名时,我本以为已经有一个很好的副本,但我找不到一个。。。
@Named
public enum FormService
{

    INSTANCE(new ArrayList<Form>());

    private List<Form> forms;

    private FormService(List<Form> forms)
    {
        this.forms = forms;
        this.forms.add(new Form("Form 1"));
    }

    public void createForm(Form form)
    {
        forms.add(form);
    }

    public List<Form> findAll()
    {
        return forms;
    }

}
@Named
@ViewScoped
public class FormController
{

    private FormService formService;

    private List<Form> forms;

    public Form form = new Form();

    @PostConstruct
    public void init()
    {
        formService = FormService.INSTANCE;
        forms = formService.findAll();
    }

    public void createForm()
    {
        formService.createForm(form);
        form = new Form();
    }

    public List<Form> getForms()
    {
        return forms;
    }

    public void setForms(List<Form> forms)
    {
        this.forms = forms;
    }

    public Form getForm()
    {
        return form;
    }

    public void setForm(Form form)
    {
        this.form = form;
    }

}
public class Form
{

    private String name;

    public Form()
    {

    }

    public Form(String name)
    {
        this.name = name;
    }


    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

}
    <dependency>
        <groupId>javax.faces</groupId>
        <artifactId>javax.faces-api</artifactId>
        <version>2.2</version>
        <scope>provided</scope>
    </dependency>