2012-10-31 59 views
1

我在h:selectOneMenu沒有選定項目時遇到問題,此時已經在輔助bean上設置了某些項目。我正在使用seam並指定了一個客戶轉換器。在我的「創建」頁面上工作時,一切正常,可以選擇菜單中的某些內容,並且在提交頁面時,正確的值將被分配並保存到數據庫中。
但是,當我在「編輯」頁面上工作時,菜單的默認選擇不是當前選擇。我所經歷和證實的東西肯定是設置等h:selectOneMenu未填充「選定」項目

我selectOneMenu用於看起來是這樣的:

<h:selectOneMenu id="selVariable" 
    value="#{customer.variableLookup}" 
    converter="#{variableLookupConverter}"> 
    <s:selectItems var="source" 
     value="#{customerReferenceHelper.variableLookups()}" 
     label="#{source.name}" /> 
</h:selectOneMenu> 

和轉換如下。這很簡單,只是原來的ID從字符串到int和背部等:

@Name("variableLookupConverter") 
public class VariableLookupConverter implements Serializable, Converter { 

@In 
private CustomerReferenceHelper customerReferenceHelper; 

@Override 
public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) { 
    VariableLookup variable= null; 
    try { 
     if ("org.jboss.seam.ui.NoSelectionConverter.noSelectionValue".equals(arg2)) { 
      return null; 
     } 
     CustomerReferenceHelper customerReferenceHelper = (CustomerReferenceHelper) Contexts.getApplicationContext().get(
       "customerReferenceHelper"); 
     Integer id = Integer.parseInt(arg2); 
     source = customerReferenceHelper.getVariable(id); 
    } catch (NumberFormatException e) { 
     log.error(e, e); 
    } 
    return variable; 

} 

@Override 
public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) { 
    String result = null; 
    VariableLookup variable= (VariableLookup) arg2; 
    Integer id = variable.getId(); 
    result = String.valueOf(id); 
    return result; 
} 
} 

我已經看到了一些東西它可能是在equals()方法的類方法,(不加起來與其他一切工作,但我推翻它無論如何如下,其中的哈希碼只是一個標識(ID對每個項目的唯一標識符)

equals方法:

@Override 
public boolean equals(Object other) { 
    if (other == null) { 
     return false; 
    } 
    if (this == other) { 
     return true; 
    } 
    if (!(other instanceof VariableLookup)) { 
     return false; 
    } 
    VariableLookup otherVariable = (VariableLookup) other; 
    if (this.hashCode() == otherVariable.hashCode()) { 
     return true; 
    } 
    return false; 
} 

我在我的智慧結束了這一點,我找不到我可能錯過了什麼?!任何幫助將不勝感激。

更新:據我瞭解,當建立列表時,它檢查每個項目的綁定值以查看它們是否匹配以設置所選項目。在equals方法中放入一些調試語句表明,在構建列表的過程中,所有比較都因爲與空對象的比較而失敗,但是在檢查接縫調試頁面時,它顯示該值已明確設置。

+0

Omnifaces有一個SelectItemConverter它可以解決你的問題。 http://showcase-omnifaces.rhcloud.com/showcase/converters/SelectItemsConverter.xhtml – bhdrkn

回答

1

試試這個;

<h:selectOneMenu id="selVariable" 
value="#{customer.variableLookup}"> 
<s:selectItems var="source" 
    value="#{customerReferenceHelper.variableLookups()}" 
    label="#{source.name}" itemValue="#{source}/> 
<s:convertEntity /> 
</h:selectOneMenu> 

我對幾乎所有的實體都使用這種表示法。

編輯

Omnifaces有SelectItemsConverter它可能解決您的問題。

+0

這種方法確實有效,但它確實會引入一些性能問題,並且在此頁面上有很多下拉菜單。 –

相關問題