JSF生成的页面和实体,选择一个菜单 [英] JSF generated pages and entities, selectOneMenu

查看:101
本文介绍了JSF生成的页面和实体,选择一个菜单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用NetBeans,我已经生成了Hibernate映射文件和一组POJO.我还从实体类(那些生成的POJO)中生成了一组JSF页面.

Using NetBeans, I have generated Hibernate mapping files and set of POJOs. I have also generated a set of JSF pages from entity classes (those generated POJOs).

现在,我尝试添加一个下拉菜单,使我能够选择其中一个实体.

Now, I am trying to add a dropdown menu that would enable me to select one of the enitites.

<h:selectOneMenu value="#{measurementController.sensor}">
    <f:selectItems value="#{sensorController.itemsAvailableSelectOne}" />
</h:selectOneMenu>

getItemsAvailableSelectOne()调用此方法:

getItemsAvailableSelectOne() calls this method:

public static SelectItem[] getSelectItems(List<?> entities, boolean selectOne) {
    int size = selectOne ? entities.size() + 1 : entities.size();
    SelectItem[] items = new SelectItem[size];
    int i = 0;
    if (selectOne) {
        items[0] = new SelectItem("", "---");
        i++;
    }
    for (Object x : entities) {
        items[i++] = new SelectItem(x, x.toString());
    }
    return items;
}

在measurementController类中,我有这个:

In measurementController class I have this:

private Sensor sensor;

public Sensor getSensor() {
    return this.sensor;
}

public void setSensor(Sensor sensor) {
    this.sensor = sensor;
}

无论我做什么,当我在下拉菜单中选择任何条目时,都会出现Validation Error: Value is not valid错误.为什么?

Whatever I do, I get Validation Error: Value is not valid error when I select any entry in the dropdown menu. Why?

我有一种很明显的缺憾,但我看不到.

I have a feeling that I am missing something very obvious, but I just can't see it.

挖槽生成的代码,我发现了一个现有的转换器类:

Digging trough generated code, I've found an existing converter class:

@FacesConverter(forClass=Sensor.class)
public static class SensorControllerConverter implements Converter {

    public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
        if (value == null || value.length() == 0) {
            return null;
        }
        SensorController controller = (SensorController)facesContext.getApplication().getELResolver().
                getValue(facesContext.getELContext(), null, "sensorController");
        return controller.ejbFacade.find(getKey(value));
    }

    java.lang.Integer getKey(String value) {
        java.lang.Integer key;
        key = Integer.valueOf(value);
        return key;
    }

    String getStringKey(java.lang.Integer value) {
        StringBuffer sb = new StringBuffer();
        sb.append(value);
        return sb.toString();
    }

    public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
        if (object == null) {
            return null;
        }
        if (object instanceof Sensor) {
            Sensor o = (Sensor) object;
            return getStringKey(o.getIdSensor());
        } else {
            throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: "+SensorController.class.getName());
        }
    }

}

当我使用调试器浏览代码时,一切似乎都可以正常工作.首先,以所选项目作为参数调用getAsObject方法,返回值是Sensor对象.

When I step trough the code with the debugger it all seems to work fine. First the getAsObject method is called with the selected item as argument, and the return value is the Sensor object.

然后调用getSensor()方法,该方法返回null(存储在measurementController类中的当前值).

Then the getSensor() method is called that returns null (the current value stored in the measurementController class).

最后,为下拉菜单中的每个项目调用getAsString()方法.我认为这是渲染"响应阶段的一部分,与验证无关.

And last, the getAsString() method gets called for every item in the dropdown menu. I think this one is a part of Render response phase and has nothing to do with validation.

推荐答案

验证错误:值无效

Validation Error: Value is not valid

如果是<h:selectOneMenu>,则根据Object#equals()合同,每当所选项目与列表中可用的任何项目都不匹配时,都会出现此验证错误.基本上,可以归结为对于列表中可用的任何SelectItem项目,sensor.equals(selectItem.getValue())从未返回true.如果Sensor类的equals()方法没有实现或执行不当,就会发生这种情况.

In case of a <h:selectOneMenu>, you can get this validation error whenever the selected item doesn't match any of the items available in the list as per the Object#equals() contract. Basically, it boils down that sensor.equals(selectItem.getValue()) has never returned true for any of the SelectItem items available in the list. This can happen if the equals() method of the Sensor class is not or poorly implemented.

这篇关于JSF生成的页面和实体,选择一个菜单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆