如何为PrimeFaces组件动态设置转换器?

时间:2018-03-13 12:28:44

标签: primefaces

我在数据表的列内使用p:autoComplete。而我正在设定 转换器使用分配给数据表converter="#{fieldVar.possibleValues}"

的变量

但它抛出: converter =“#{fieldVar.possibleValues}”:java.lang.IllegalArgumentException:无法将类型为java.lang.String的userConverter转换为接口javax.faces.convert.Converter

possibleValues is a string

如果不可能,那么我们如何动态更改转换器。

 <p:dataTable var="fieldVar" value="#{dynamicReportBean.screenMetadataDTOs}" id="edit_meta_data_datatable">

                    <p:column headerText="Filter Names">
                        <h:outputText value="#{fieldVar.filedName}"/> 
                    </p:column>

                    <p:column headerText="Filter Values">
                        <p:inputText value ="#{fieldVar.filedValue}" 
                                     placeholder="#{fieldVar.filedName}"
                                     rendered="#{dynamicReportBean.canRenderFieldType(fieldVar.fieldId, 'TEXTFIELD')}" style="width: 220px">
                        </p:inputText>

                        <p:selectOneMenu value="#{fieldVar.filedValue}" 
                                         rendered="#{dynamicReportBean.canRenderFieldType(fieldVar.fieldId, 'DROPDOWN')}" style="width: 220px">
                            <f:selectItems value="#{dynamicReportBean.retrievePossibleDropDownValues(fieldVar.fieldId, fieldVar.fieldType, fieldVar.possibleValues)}"/>
                        </p:selectOneMenu>

                        <p:selectManyMenu value="#{fieldVar.filedValue}" 
                                          style="width: 220px"
                                          showCheckbox="true"
                                          rendered="#{dynamicReportBean.canRenderFieldType(fieldVar.fieldId, 'SELECT_MANY_CHECKBOX')}">  
                            <f:selectItems value="#{dynamicReportBean.retrievePossibleDropDownValues(fieldVar.fieldId, fieldVar.fieldType, fieldVar.possibleValues)}"/>
                        </p:selectManyMenu>

                        <p:autoComplete  value="#{fieldVar.filedValue}"  
                                         style="width: 220px"
                                         placeholder="autocomplete"
                                         completeMethod="#{dynamicReportBean.getAutoCompleteMethod}"
                                         rendered="#{dynamicReportBean.canRenderFieldType(fieldVar.fieldId, 'AUTOCOMPLETE')}"
                                         scrollHeight="300"
                                         converter="#{fieldVar.possibleValues}" 
                                         size="25">
                            <f:attribute name="converterName" value="#{fieldVar.possibleValues}" />
                            <p:ajax event="itemSelect" listener="#{dynamicReportBean.onHandleSelect}"/>
                        </p:autoComplete>

                    </p:column>

                </p:dataTable>

如果我通过converter = "userConverter"它工作正常,而不是我希望转换器值动态地

public class UserConverter implements Converter {

@Override
public Object getAsObject(FacesContext context, UIComponent component,
        String value) {
    UserLOVBean lOVBean = null;
    try {
        UserService service = new UserServiceImpl();
        UserFilterDTO filterDTO = new UserFilterDTO();
        UserContext userContext
                = (UserContext) context.getExternalContext().getSessionMap().
                get("USER_CONTEXT");
        filterDTO.setCmpCode(userContext.getCmpCode());
        filterDTO.setOrgCode(userContext.getOrgCode());

        if (value != null) {
            filterDTO.setUserId(value);
        }
        for (UserLOVDTO lOVDTO : service.retrieveUserForAutoComplete(
                filterDTO)) {
            if (value.equals(lOVDTO.getUserId())) {
                lOVBean = new UserLOVBean();
                CopyUtil.copyValues(lOVDTO, lOVBean);
            }
        }
    } catch (Exception ex) {
        ex.printStackTrace();
        Logger.getLogger(UserConverter.class.getName()).log(Level.SEVERE,
                null, ex);
    }
    return lOVBean;
}

@Override
public String getAsString(FacesContext context, UIComponent component,
        Object value) {
    return String.valueOf(((UserLOVBean) value).getUserId());
}

}

1 个答案:

答案 0 :(得分:0)

使用p:autoComplete属性为converter(和任何其他PrimeFaces组件)设置转换器记录为:

  

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

因此,如果要使用EL表达式,则必须指向转换器的实例。在你的bean中你可以简单地添加:

public UserConverter getUserConverter() {
  return new UserConverter();
}

然后,在您的XHTML中,使用:

<p:anyComponent converter="#{myBean.userConverter}"/>