2013-03-28 56 views
0

我有一個primefaces selectOneMenu,它使用javax.faces.convert.Converter來顯示設備。當ID大於127時FacesConverter失敗?

只有當鍵(device's id)不大於127時,它才能正常工作。當它更大時,單擊commandButton後,selectOneMenu的箭頭變爲紅色,commandButton的動作不會執行。

爲什麼?有任何想法嗎?

<p:selectOneMenu id="deviceActionParameter" 
    value="#{sm.ruleConfigureBean.deviceActionParameter}" 
    style="width:200px;"> 
    <f:selectItems value="#{sm.ruleConfigureBean.sensors}" 
     var="device" itemLabel="#{device.name}" /> 
    <f:converter converterId="deviceConverter" /> 
</p:selectOneMenu> 

轉換器:

@FacesConverter(value = "deviceConverter") 
public class DeviceConverter implements Converter { 

    @Override 
    public Object getAsObject(FacesContext arg0, UIComponent arg1, String key) { 
     DeviceDao deviceDao = GuiceSingleton.getInstance().getInstance(
       DeviceDao.class); 
     try { 
      Device device = deviceDao.getDeviceById(new Long(key)); // this works 
      return device; 
     } catch (Exception e) { 
      return null; 
     } 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, 
      Object value) { 
     if (value != null && value instanceof Device) { 
      Device device = (Device) value; 
      return "" + device.getIdDevice(); 
     } 
     return ""; 
    } 
} 
+1

任何拋出的異常? –

+2

我非常難以將'Integer'與'=='進行比較。 –

+0

「過早優化」的情況下,如果你問我 –

回答

0

我相信這是Java的整數caching mechanism的優化,

 Integer int1=128; 
     Integer int2=128; 

     if(int1==int2) 
      System.out.println("yes"); 
     else 
      System.out.println("no"); 

將在顯示範圍爲yes整數[-128, 127]no否則。
如果使用equals,那麼它將始終爲yes

解決方案:

  • 變化getDeviceById()到使用等於

  • 我相信在以後的版本中,它是更多鈔票來增加這個範圍

  • 否則堅持長期
+0

ids通過mybatis進行比較(SQL查詢中的「=」)並且工作正常:從數據庫中獲取適當的對象。 而且我已經和龍已經在一起了。 – Teodor

0

的問題不在轉換器中,但在Device類中 - 我比較了Longs w ith ==。

現在,它的確定:

@Override 
public boolean equals(Object o) { 
    if (o instanceof Device) { 
     return idDevice.equals(((Device) o).getIdDevice()); 
    } 
    return false; 
} 

感謝答案:)

相關問題