我正在尝试使 selectManyMenu 工作,但我在正确编写转换器时遇到问题。这是我第一次需要编写转换器,所以事情对我来说不是那么清楚。我已经阅读了几个地方,我不应该在转换器中对数据库进行任何调用,但是除了调用 DB 之外,如何在 getAsObject 方法中获取某些 ID 的对象?
@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}" ,当我将鼠标指针放在某个记录上时,会显示 itemDescription。因此,显然组件可以访问所有记录,但它的名称没有显示出来。您可以在以下位置查看屏幕截图: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>
第二个问题是将字符串转换为对象,我不确定我必须做什么 - 是否调用 DB?目前,无论我尝试什么,我都会遇到错误,从 String (id?) 获取 Object 的正确方法是什么?
我按照http://www.primefaces.org/showcase/ui/input/manyMenu.xhtml上的说明进行操作,但不确定我做错了什么以及为什么我至少不能显示记录名称(getAsString 真的很简单,它应该工作)
有没有人有一些建议或已经有 selectManyMenu 的转换器?如果您需要更多信息,我很乐意为您提供。
谢谢!