簡體   English   中英

id大於127時FacesConverter失敗?

[英]FacesConverter fail when id greater than 127?

我有一個primefaces selectOneMenu,它使用javax.faces.convert.Converter來顯示設備。

僅當鍵(設備的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 "";
    }
}

我相信這是Java Integer 緩存機制的優化,

        Integer int1=128;
        Integer int2=128;

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

對於[-128, 127]范圍內的整數,將顯示yes ,否則顯示no
如果equals比使用它將yes所有的時間。

解決方案:

  • 更改getDeviceById()以使用equals

  • 我相信在更高版本中可以增加此范圍

  • 否則堅持長

問題不在轉換器中,而在設備類中-我正在將Longs與==進行比較。

現在好啦:

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

感謝您的回答:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM