2

我正在尝试将 SelectItemsConverter 与 PrimeFaces Picklist 一起使用。

XHTML:

<p:pickList id="plUpdateFirma" value="#{bsvttController.dlmFirma}" var="plFirma"
    itemLabel="#{plFirma.schluesselFirma}" itemValue="#{plFirma}"
    converter="FirmaConverter">

    <f:facet name="sourceCaption">
        Vorjahr
    </f:facet>
    <f:facet name="targetCaption">
        #{bsvttController.selSaison}
    </f:facet>

    <p:column>
        #{plFirma.schluesselFirma}  
    </p:column>

</p:pickList>

转换器:

@FacesConverter(value = "FirmaConverter")
public class FirmaConverter extends SelectItemsConverter
{ 

    @Override
    public String getAsString(final FacesContext facesContext, final UIComponent component, final Object object)
    {
        return ((Firma) object).getSchluesselFirma();
    }

}

豆:

@ManagedBean
@ViewScoped
public class BsvttController implements Serializable
{
    private DualListModel<Firma> dlmFirma;
    private List<Firma> dlmFirmaSource;
    private List<Firma> dlmFirmaTarget;
    private Firma firma;

    @PostConstruct
    public void init()
    {
        dlmFirmaSource = FirmaPersistenz.leseFirmaAlle();
        dlmFirmaTarget = new ArrayList<Firma>();
        dlmFirma = new DualListModel<>(dlmFirmaSource, dlmFirmaTarget);
    }

    public DualListModel<Firma> getDlmFirma()
    {
        return dlmFirma;
    }
    public List<Firma> getDlmFirmaSource()
    {
        return dlmFirmaSource;
    }
    public List<Firma> getDlmFirmaTarget()
    {
        return dlmFirmaTarget;
    }

    public void setDlmFirma(DualListModel<Firma> dlmFirma)
    {
        this.dlmFirma = dlmFirma;
    }
    public void setDlmFirmaSource(List<Firma> dlmFirmaSource)
    {
        this.dlmFirmaSource = dlmFirmaSource;
    }
    public void setDlmFirmaTarget(List<Firma> dlmFirmaTarget)
    {
        this.dlmFirmaTarget = dlmFirmaTarget;
    }

}

在调试转换器时,我可以看到 getAsString 方法工作正常。但是在提交表单后,两个数组列表(dlmFirmaSource 和 dlmFirmaTarget)都是空的。

OmniFaces 展示柜说

“omnifaces.SelectItemsConverter 允许您使用复杂的 Java 模型对象作为 f:selectItems 的值填充例如下拉列表,并让 JSF 自动将这些对象转换回来,而无需提供可能需要根据可能完成工作的自定义转换器昂贵的服务/DAO 操作。”

但如果是 PickList 组件,则不存在任何 f:selectItems 标记。

SelectItemsConverter 是否甚至支持 PickList 组件?

4

2 回答 2

4

SelectItemsConverter 是否甚至支持 PickList 组件?

不,它没有。

从 OmniFaces 1.5 开始,您可以将omnifaces.ListConverteromnifaces.ListIndexConverter用于所需的目的。另请参阅展示示例,ListConverter示例还演示了<p:pickList>.

于 2013-06-25T19:11:47.977 回答
2

不,SelectItemsConverter 处理核心 JSF SelectItem 对象的转换,以便与各种 JSF 组件一起使用。

该类DualListModel是 PrimeFaces 特定类,旨在与高级 PrimeFaces 数据组件一起使用。解决方法当然是可以使用一种@PostConstruct方法在托管 bean 中初始化 DualListModel 以便它不需要转换器,或者您可以简单地以传统方式实现转换器。converter来自关于Pick List 属性的 PrimeFaces 指南:

为组件定义转换器的 el 表达式或文字文本。当它是一个 EL 表达式时,它被解析为一个转换器实例。如果是静态文本,则必须引用转换器 ID

于 2013-02-12T13:26:48.573 回答