当id大于127时,FacesConverter会失败吗?

时间:2013-03-28 17:23:19

标签: java jsf primefaces selectonemenu

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

2 个答案:

答案 0 :(得分:0)

我认为它是Java Integer 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()更改为使用等于

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

  • 否则坚持使用Long

答案 1 :(得分:0)

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

现在没关系:

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

感谢您的回答:)