2013-03-31 37 views
1

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

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

} 
+2

你需要一个自定义转换器。 Mkyong提供了一个例子:http://www.mkyong.com/jsf2/custom-converter-in-jsf-2-0/ –

+0

看到这个答案http://stackoverflow.com/a/22002268/3284943如何完成这没有转换器。 – brs5tettba

回答

5

您正在尝试Currency类的Java对象映射到是作为一个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.利用普通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?

+0

我做了转换器。现在我看到空指针异常。 :( – Umair

+0

我已经做了一个转换器。现在我看到空指针异常。[链接](http://stackoverflow.com/questions/15733862/pick-custom-object-from-select-one-menu-jsf-转换器 - 例外) – Umair

+0

@Umair来自你的重复内容,看起来像托管bean注入失败。你确定你的'ICurrencyService'是一个托管bean还是一个EJB? –

0

您可以为自定义对象货币创建Converter。

步骤1:创建一个Converter类并实现javax.faces.convert.Converter接口,重写getAsObject和getAsString方法,并编写字符串到对象转换和对象到字符串转换的逻辑。

步骤2:在转换器类中简单声明类似@FacesConverter(“currencyConverter”)或如果要在Converter类中使用Spring Inject或Autowired Annotation使用@Component声明Converter类(“currencyConverter”)注释和don不要使用@ FacesConverter.And你的转换器类应该在组件扫描包中。

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

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

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

相关问题