我正在尝试使selectManyMenu正常工作,但我正确地为它编写转换器时遇到了问题。这是我第一次需要编写转换器,所以对我来说不太清楚。我已经阅读了几个地方,我不应该在转换器中对数据库进行任何调用,但是如何在getAsObject方法中获取某些ID的对象,而不是调用DB?
@FacesConverter(value = "converterTest")
public class ConverterTest implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
Configuration cfg = new Configuration();
cfg.configure("hibernate.cfg.xml");
System.out.println("ID: " + value);
SessionFactory factory = cfg.buildSessionFactory();
try {
Session session = factory.openSession();
Equipment e = (Equipment) session.get(Equipment.class, Integer.valueOf(value));
System.out.println("EQUIPMENT ID : " + e.getId());
return e;
} catch(Exception ex) {
System.out.println("ERROR: " + ex.getMessage());
return null;
}
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object object) {
if(object != null) {
System.out.println("ID: " + String.valueOf(((Equipment) object).getId()));
return String.valueOf(((Equipment) object).getId());
}
else {
return null;
}
}
}
重要:
当页面加载时,我的selectManyMenu充满了记录,但我看不到它的名字,只是复选框和空格而不是记录(设备)的名称。但是,如果我尝试在搜索过滤器中放置一些字符,即使我只看到复选框而不是名称,它也能正常工作。我添加了itemDescription =“#{record.name}”,当我将鼠标指针放在某个记录项上时,显示了描述。因此,显然组件可以访问所有记录,但其名称未显示。您可以看到屏幕截图:http://i57.tinypic.com/2wpm2ok.png(“Autoklav”是不希望显示在列表中的记录名称,但它显示为描述)。这不是css问题,我查了一下:))
这是我的selectManyMenu:
<p:selectManyMenu id="advanced" value="#{pickListView.recordSet}" converter="converterTest"
var="t" filter="true" filterMatchMode="contains" showCheckbox="true">
<f:selectItems value="#{pickListView.allEquipment}" var="record" itemLabel="#{record.name}" itemValue="#{record}" />
<p:column style="width:90%">
<h:outputText value="#{record.name}" />
</p:column>
</p:selectManyMenu>
第二个问题是将String转换为Object,我不知道我要做什么 - 是否要调用DB?目前我在尝试时遇到错误,从String获取Object的正确方法是什么(id?)?
我按照http://www.primefaces.org/showcase/ui/input/manyMenu.xhtml的说明,但不确定我做错了什么以及为什么我不能得到至少记录的名字(getAsString非常简单,它应该有效)
是否有人有建议或已经有selectManyMenu的转换器? 如果您需要更多信息,我很乐意给您。
谢谢!