从选择一个菜单JSF中选择自定义对象

Uma*_*air 1 jsf selectonemenu jsf-2

我想从选择一个菜单中选择一个自定义对象.它既不显示错误也不显示值.我该怎么办?

我的xhtml文档:

<h:panelGrid columns="2">
    <p:outputLabel value="" />
        <p:selectOneMenu id="CurrencyMenu" value="#{CurrencyMB.currency}" >
            <f:selectItem itemLabel="-- Select Currency--" itemValue="#{null}"/>
        <f:selectItems value="#{CurrencyMB.currencyList}" var="currency"  itemValue="#{currency.currencyId}" itemLabel="#{currency.currencyName}" > 
            </f:selectItems>
        <p:ajax update="currencyOut" />
        </p:selectOneMenu>
        <p:outputLabel value="Currency Id : #{CurrencyMB.currency.currencyId}" id="currencyOut" />
</h:panelGrid>
Run Code Online (Sandbox Code Playgroud)

我的managedBean类:

@ManagedBean(name = "CurrencyMB")
@RequestScoped
public class CurrencyManagedBean {

private Currency currency;
private List<Currency> currencyList;


public Currency getCurrency() {
        return currency;
    }

public void setCurrency(Currency currency) {
        this.currency = currency;
    }
public List<Currency> getCurrencyList() {
        currencyList = new ArrayList<Currency>();
        currencyList.addAll(getiCurrencyService().getCurrencies());
        return currencyList;
    }

public void setCurrencyList(List<Currency> currencyList) {
        this.currencyList = currencyList;
    }

}
Run Code Online (Sandbox Code Playgroud)

sku*_*sel 7

您正在尝试将类的Java对象映射Currency到作为HTTP请求参数的字符串.转换器旨在用于需要从其字符串表示创建对象的情况,反之亦然,就像您遇到的情况一样.

基本上有两种方法.

1.利用转换器.

使用此方法,您可以将项值定义为Currency对象,并使用转换器从对象创建字符串表示,并从字符串重新创建对象.对于转换器部分,请按照Luiggi指出的教程进行操作.基本上你需要创建一个实现的类Converter,注释它@FacesConverter("currencyConverter")以便能够通过id引用转换器,就像在converter="currencyConverter"JSF标记的属性中一样:

<p:selectOneMenu id="CurrencyMenu" value="#{CurrencyMB.currency}" converter="currencyConverter">
    <f:selectItems value="#{CurrencyMB.currencyList}" var="currency"  itemValue="#{currency}" itemLabel="#{currency.currencyName}" /> 
    <p:ajax update="currencyOut" />
</p:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)

2.使用plain Strings(或java原始包装器).

使用此方法,您可以将项值以及用户选择绑定到String类型的bean属性,而不是绑定到实际对象.以这种方式使用它您将不需要任何转换器,并且将为您设置字符串值:

<p:selectOneMenu id="CurrencyMenu" value="#{CurrencyMB.currencyName}">
    <f:selectItems value="#{CurrencyMB.currencyList}" var="currency"  itemValue="#{currency.currencyName}" itemLabel="#{currency.currencyName}" /> 
    <p:ajax update="currencyOut" />
</p:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)

最后,值得一读的问题为什么选择OneOneMenu发送ItemLabel到转换器?.