我正在 JSF 中开发一个应用程序,我在其中使用<h:selectOneListbox .../>
. 我为此定义了一个Converter
.
下面我展示了所述控件的简化块,其中包含panelGrid
一个按钮Guardar
和一个列表选择器:
<h:panelGrid cellpadding = "5" columns = "4" >
<p:commandButton value="Guardar"
update=":dmContadoresConsumoForm:edicionContadorConsumoPnl"
disabled="#{!contadoresConsumoBean.contadorCentroEditable}"
actionListener="#{contadoresConsumoBean.guardarContador}"/>
<h:outputText value = "Producto" />
<h:selectOneListbox
id = "productoSel"
size = "1"
value = "#{contadoresConsumoBean.productoSeleccionado}"
disabled = "#{!contadoresConsumoBean.contadorCentroEditable}"
style = "width:100%" >
<f:selectItem itemValue = "0"
itemLabel = "" / >
<f:selectItems
value = "#{contadoresConsumoBean.productos}"
var = "producto"
itemValue = "#{producto.id}"
itemLabel = "#{producto.nombre}" />
</h:selectOneListbox>
<!-- ... -->
</h:panelGrid>
我定义了一个Converter
for 类型的对象Producto
,其代码如下:
@ManagedBean(name = "productoConverter")
@SessionScoped
@FacesConverter(forClass = Producto.class)
public class ProductoConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
long id = -1;
try{
id = Long.parseLong(value);
}
catch(Exception e){
return null;
}
Transaction t = HibernateUtil.getSessionFactory().getCurrentSession().beginTransaction();
try{
Producto e = new ProductoServiceImpl().find(id);
t.commit();
return e;
}
catch(Exception e){
t.rollback();
e.printStackTrace();
return null;
}
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value instanceof Producto){
return ((Producto)value).getId().toString();
}
return null;
}
}
问题是当我按下按钮保存更改时,出现错误:
dmContadoresConsumoForm:productoSel: Error de validación: el valor no es válido
我试过调试Converter
它,它似乎工作正常。
显然,发生错误是因为您必须覆盖应用转换器的 bean 中的
equals(Object object)
和方法hashCode()
。另一方面,在xhtml文件中,我修改了attribute的值
itemValue="#{producto}"
,所以解决方法如下:xhtml:
ProductConverter.java
转换器没有任何错误,所以还是一样:
产品.java
在这个类中,我重写了方法
equals(Object object)
和hashCode()