我想从选择一个菜单中选择一个自定义对象。它既不显示错误也不显示值。我该怎么办?
我的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;
}
}
答案 0 :(得分:6)
您正在尝试将类Currency
的Java对象映射到作为HTTP请求参数的字符串。转换器旨在用于需要从其字符串表示形式创建对象的情况,反之亦然,就像您遇到的情况一样。
基本上有两种方法。
<强> 1。利用转换器。
使用此方法,您可以将项值定义为Currency
对象,并使用转换器从对象创建字符串表示,并从字符串重新创建对象。对于转换器部分,请按照Luiggi指出的教程进行操作。基本上你需要创建一个实现Converter
的类,用@FacesConverter("currencyConverter")
注释它以便能够通过id引用转换器,就像在JSF标记的converter="currencyConverter"
属性中一样:
<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。使用普通String
s(或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>
最后,值得回答问题Why selectOneMenu Send ItemLabel to the converter?。
答案 1 :(得分:0)
您可以为自定义对象货币创建转换器。
步骤1:创建一个Converter类并实现javax.faces.convert.Converter接口,覆盖getAsObject和getAsString方法,并将String的逻辑编写为Object Conversion和Object to String Conversion。
步骤2:在转换器类中简单地声明类似@FacesConverter(“currencyConverter”)的内容,或者如果要在Converter类中使用Spring Inject或Autowired Annotation,请使用@Component(“currencyConverter”)注释来声明您的Converter类并且不要使用@ FacesConverter。您的转换器类应该在组件扫描包中。
步骤3:使用转换器属性在Selectonemenu中声明转换器。
如果您仍有任何问题,请参阅此链接
http://www.techpages.org/jsf/jsf-custom-object-converter-from-selectonemenu/2428/