1

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

我的 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>

我的 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;
    }

}
4

2 回答 2

8

您正在尝试将类的 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>

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>

最后,值得一读的问题到答案为什么 selectOneMenu 将 ItemLabel 发送给转换器?.

于 2013-03-31T18:47:27.067 回答
0

您可以为您的自定义对象货币创建转换器。

第 1 步:创建一个 Converter 类并实现 javax.faces.convert.Converter 接口,重写 getAsObject 和 getAsString 方法并编写 String 到 Object 转换和 Object 到 String 转换的逻辑。

第 2 步:只需在您的转换器类中声明类似 @FacesConverter("currencyConverter") 的内容,或者如果您想在 Converter 类中使用 Spring Inject 或 Autowired Annotation,请使用 @Component("currencyConverter") 注释声明您的 Converter 类,不要使用 @ FacesConverter.And 你的转换器类应该在组件扫描包中。

第 3 步:在 Selectonemenu 中使用转换器属性声明您的转换器。

如果您还有任何问题,请参考此链接

http://www.techpages.org/jsf/jsf-custom-object-converter-from-selectonemenu/2428/

于 2013-07-30T08:44:24.123 回答