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ます。使用される
場合は、常に使用されます。equalsyes

ソリューション:

  • getDeviceById()equals を使用するように変更

  • それ以降のバージョンでは、この範囲を拡大できると思います

  • それ以外の場合は、ロングに固執します
于 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 に答える