Primefaces selectOneListbox不显示项目文本(项目中包含的数据也不是)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Primefaces selectOneListbox不显示项目文本(项目中包含的数据也不是)相关的知识,希望对你有一定的参考价值。

我的PrimeFaces selectOneListbox中有3000个项目 - 从chrome的调试器中的对象检查器可以看出。 div行都在那里,但是显示文本中没有数据。 div都是空的。

我仔细检查,itemValue指向company.name,其中包含数据。此外,itemLabel获取公司的唯一符号,因此也应该没问题,因为该数据全部有效。但是,我错过了一些东西,因为UI显示一个空白框,明显高于其默认值 - 正如我所说,在chrome的调试器中包含空div的3000个空项目。

我的xhtml中的selectOneListbox代码如下。我已经尝试将地图作为集合和托管bean中的列表(因此我将值更改为我想要尝试的任何变量)。地图和公司列表都产生了相同的结果 - javascript中的3000个条目列表(如下所示)

<p:selectOneListbox id="symbolPicker" value="#{simulationBean.company}" converter="companyConverter" var="t" filter="true" filterMatchMode="contains">
    <f:selectItems value="#{simulationBean.companyMap}" var="company" itemLabel="#{company.symbol}" itemValue="#{company}" />
</p:selectOneListbox>                                   

空项的javascript:

Pic of chrome debugger

托管bean只存储一个显然已初始化@PostConstruct的公司列表,因为我的调试器中的对象被枚举(其中3000个) - 因此公司在那里并且他们的数据是有效的(我可以看到数据中的数据)调试器)。

而且我猜测罪魁祸首将出现在下一个对象中。我无法想象我错过了什么 - 它似乎一定非常明显 - 这是公司实体本身:

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;

import com.google.gson.JsonObject;

@Entity
@Table(name = "company")
public class Company implements Serializable {

    private static final long serialVersionUID = 1L;

    private String symbol;

    @Column
    private String name;

    @Column(columnDefinition="market_category")
    private String marketCategory;

    @Column(columnDefinition="test_issue")
    private Integer testIssue;

    @Column(columnDefinition="good_status")
    private Integer goodStatus;

    @Column(columnDefinition="round_lot")
    private Integer roundLot;

    @Column
    private Integer etf;

    public Company() {}

    public Company(String symbol, String name, String marketCategory, Integer testIssue, Integer goodStatus, Integer roundLot, Integer etf) {
        super();
        this.symbol = symbol;
        this.name = name;
        this.marketCategory = marketCategory;
        this.testIssue = testIssue;
        this.goodStatus = goodStatus;
        this.roundLot = roundLot;
        this.etf = etf;
    }

    @Id
    public String getSymbol() {
        return symbol;
    }

    public void setSymbol(String symbol) {
        this.symbol = symbol;
    }

    public String getName() {
        return name;
    }

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

    public String getMarketCategory() {
        return marketCategory;
    }

    public void setMarketCategory(String marketCategory) {
        this.marketCategory = marketCategory;
    }

    public Integer getTestIssue() {
        return testIssue;
    }

    public void setTestIssue(Integer testIssue) {
        this.testIssue = testIssue;
    }

    public Integer getGoodStatus() {
        return goodStatus;
    }

    public void setGoodStatus(Integer goodStatus) {
        this.goodStatus = goodStatus;
    }

    public Integer getRoundLot() {
        return roundLot;
    }

    public void setRoundLot(Integer roundLot) {
        this.roundLot = roundLot;
    }

    public Integer getEtf() {
        return etf;
    }

    public void setEtf(Integer etf) {
        this.etf = etf;
    }

    @Override
    public String toString() {
        return symbol;
    }

    public String toDebugString() {
        return "Company [symbol=" + symbol + ", name=" + name + ", marketCategory=" + marketCategory + ", testIssue="
                + testIssue + ", goodStatus=" + goodStatus + ", roundLot=" + roundLot + ", etf=" + etf + "]";
    }

    @Transient
    public JsonObject getJsonObject() {

        JsonObject result = new JsonObject();

        result.addProperty("symbol", symbol);
        result.addProperty("name", name);
        result.addProperty("marketCategory", marketCategory);
        result.addProperty("testIssue", testIssue);
        result.addProperty("goodStatus", goodStatus);
        result.addProperty("roundLot", roundLot);
        result.addProperty("etf", etf);
        return result;
    }

    @Override
    public boolean equals(Object obj) {

        // null check
        if (obj == null) {
            return false;
        }

        // this instance check
        if (this == obj) {
            return true;
        }

        // instanceof Check and actual value check
        if ((obj instanceof Company) && (((Company) obj).getSymbol() == this.symbol)) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public int hashCode() {

        return symbol.hashCode();
    }
}

现在我也有一个转换器:

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

import com.appzany.stockService.BeanUtil;
import com.appzany.stockService.entity.Company;
import com.appzany.stockService.stockservice.StockService;

@FacesConverter("companyConverter")
public class CompanyConverter implements Converter {

    private StockService stockService = null;

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {

        if(stockService == null)
            stockService = BeanUtil.getBean(StockService.class);
        return stockService.getCompany(value);
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        return ((Company)value).getSymbol();
    }
}
答案

你似乎想要使用'高级'p:selectOneListbox,它在their showcase中如下

<p:selectOneListbox id="advanced" value="#{selectOneView.theme}" converter="themeConverter" var="t" filter="true" filterMatchMode="contains">

    <f:selectItems value="#{selectOneView.themes}" var="theme" itemLabel="#{theme.displayName}" itemValue="#{theme}" />

    <p:column>
        <h:graphicImage name="showcase/images/themeswitcher/themeswitcher-#{t.name}.png" alt="#{t.name}" styleClass="ui-theme" />
    </p:column>

    <p:column>
        <h:outputText value="#{t.displayName}" />
    </p:column>
</p:selectOneListbox>

其中p:selectOneListboxf:selectItems都有一个var属性,其中p:selectOneListbox的var属性用于此组件内的显式附加标记。这些额外的p:column标签及其内容负责“高级”渲染。你没有任何这个,我认为(抱歉,没有尝试)导致渲染“没有”。如果你要添加一些像渲染的东西

<p:column>
    <h:outputText value="#{t.name}" />
</p:column>

<p:column>
    <h:outputText value="#{t.symbol}" />
</p:column>

我确定要呈现的东西。

以上是关于Primefaces selectOneListbox不显示项目文本(项目中包含的数据也不是)的主要内容,如果未能解决你的问题,请参考以下文章

实现PrimeFaces扩展时出错

使用ajax从jsf中的primefaces树选定项设置primefaces selectOneMenu默认值

JSF 2 PrimeFaces 安装

在 PrimeFaces 中添加 Angular Js - JSF

IBM Bluemix 支持 Primefaces? [关闭]

Primefaces 6.0 对话框框架和框架集