【问题标题】:FacesConverter fail when id greater than 127?当 id 大于 127 时 FacesConverter 失败?
【发布时间】:2013-03-28 17:23:18
【问题描述】:

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

只有当key(设备的id)不大于127时才能正常工作。当大于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 "";
    }
}

【问题讨论】:

  • 是否抛出异常?
  • 在与== 比较时,我闻到了一些Integers 的味道。
  • 一个“过早优化”的案例,如果你问我
  • 尝试在转换器的 catch 块中生成日志。
  • @RodrigoSasaki 不,任何异常都会被抛出。

标签: java jsf primefaces selectonemenu


【解决方案1】:

相信是对Java Integer caching mechanism的优化,

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

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

  • 否则坚持Long

【讨论】:

  • 在 getDeviceById() 中,id 由 mybatis(SQL 查询中的“=”)进行比较,并且工作正常:从数据库中获取正确的对象。我已经坚持使用 Long。
【解决方案2】:

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

现在好了:

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

感谢您的回答:)

【讨论】:

    猜你喜欢
    • 2014-12-23
    • 2015-01-04
    • 2021-10-29
    • 2014-11-10
    • 2021-06-05
    • 1970-01-01
    • 2017-06-01
    • 2018-10-08
    • 1970-01-01
    相关资源
    最近更新 更多