当id大于127时FacesConverter失败



我有一个primefaces selectOneMenu,它使用javax.faces.convert.Converter来显示设备。

只有当密钥(设备的id)不大于127时才能正常工作。当它更大时,单击命令按钮后,selectOneMenu的箭头变为红色,并且命令按钮的操作不会执行。

为什么?什么好主意吗?

<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]no范围内的整数将显示yes,否则
如果使用equals,那么它将一直是yes

解决方案:

  • 改变getDeviceById()使用=

  • 我相信在以后的版本中可以增加这个范围

  • 否则坚持使用长

问题不在于转换器,而在于Device类-我正在比较long和==.

现在好了:

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

谢谢你的回答

相关内容

  • 没有找到相关文章

最新更新