0

我有一个 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 "";
    }
}
4

2 回答 2

0

我相信这是对 Java Integer缓存机制的优化,

        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()使用等于

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

  • 否则坚持 Long
于 2013-03-28T17:39:18.763 回答
0

问题不在于转换器,而在于 Device 类 - 我将 Longs 与 == 进行比较。

现在好啦:

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

感谢您的回答:)

于 2013-04-04T13:38:08.533 回答