gpt4 book ai didi

java - JSF 生成的页面和实体,selectOneMenu

转载 作者:行者123 更新时间:2023-12-04 06:45:55 25 4
gpt4 key购买 nike

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

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

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

getItemsAvailableSelectOne() 调用此方法:
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类中,我有这个:
private Sensor sensor;

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

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

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

我有一种感觉,我错过了一些非常明显的东西,但我就是看不到它。

编辑:

挖掘生成的代码,我发现了一个现有的转换器类:
@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 对象。

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

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

最佳答案

Validation Error: Value is not valid



如果是 <h:selectOneMenu> ,根据 Object#equals(),只要所选项目与列表中的任何可用项目不匹配,您就会收到此验证错误。契约(Contract)。基本上,它归结为 sensor.equals(selectItem.getValue())再也没有回来 true对于任何 SelectItem列表中可用的项目。如果 equals() 会发生这种情况 Sensor的方法类没有执行或执行不力。

关于java - JSF 生成的页面和实体,selectOneMenu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3773611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com