我正在尝试将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();
}
}
Bean:
@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组件吗?
SelectItemsConverter甚至支持PickList组件吗
不,不是。
由于OmniFaces 1.5,您可以将omnifaces.ListConverter
或omnifaces.ListIndexConverter
用于所需目的。另请参阅ListConverter
展示示例,该示例还演示了<p:pickList>
的用法。
否,SelectItemsConverter处理核心JSF SelectItem对象的转换,以便与各种JSF组件一起使用。
类DualListModel
是PrimeFaces特定的类,用于高级PrimeFace数据组件。当然,解决方法是可以使用@PostConstruct
方法在托管bean中初始化DualListModel,这样它就不需要转换器,或者您可以简单地以传统方式实现转换器。从PrimeFaces指南中的拾取列表的converter
属性:
定义组件的转换器。当它是EL表达式,它被解析为转换器实例。如果是静态文本,则必须引用转换器id