我有一个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 "";
}
}
答案 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()
更改为使用等于
我相信在以后的版本中可以增加这个范围
答案 1 :(得分:0)
问题不在转换器中,而是在Device类中 - 我将Longs与==进行比较。
现在没关系:
@Override
public boolean equals(Object o) {
if (o instanceof Device) {
return idDevice.equals(((Device) o).getIdDevice());
}
return false;
}
感谢您的回答:)