OmniFaces:SelectItemsConverter不使用PrimeFaces:PickList

时间:2013-02-12 12:45:30

标签: jsf primefaces omnifaces

我正在尝试将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方法工作正常。但在提交表单后,两个arraylists(dlmFirmaSource和dlmFirmaTarget)都是空的。

OmniFaces展示说

  

“omnifaces.SelectItemsConverter允许您将复杂Java模型对象的下拉列表填充为f:selectItems的值,并让JSF自动将其转换回来,而无需提供可能需要执行此操作的自定义转换器基于可能昂贵的服务/ DAO操作。“

但是在PickList组件的情况下,不存在任何f:selectItems标签。

SelectItemsConverter是否支持PickList组件?

2 个答案:

答案 0 :(得分:4)

  

SelectItemsConverter是否支持PickList组件?

不,它没有。

自OmniFaces 1.5起,您可以将omnifaces.ListConverteromnifaces.ListIndexConverter用于所需目的。另请参阅the ListConverter showcase example,其中还演示了<p:pickList>上的用法。

答案 1 :(得分:2)

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

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

  

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