我的primefaces pickList源和目标值不会改变,我已经按照primefaces showcase中的示例进行了操作 并且还看了几个帖子,但仍然无法解决问题。我正在使用数据库中的列表来填充源代码,如下所示:
private DualListModel<Course> courseModel;
public CourseBean() {
List<Course> target = new ArrayList<Course>();
List<Course> source = new ArrayList<Course>();
courseModel = new DualListModel<Course>(source, target);
}
...
//this DualListModel getter also populates the source with values from db
public DualListModel<Course> getCourseModel() {
courseModel.setSource(getCourseList());
return courseModel;
}
我的转换器是
import org.omnifaces.converter.SelectItemsConverter;
@FacesConverter("courseConverter")
public class CourseConverter extends SelectItemsConverter {
@Override
public String getAsString(FacesContext context, UIComponent component,
Object value) {
Integer id = (value instanceof Course) ? ((Course) value).getId()
: null;
return (id != null) ? String.valueOf(id) : null;
}
@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String value) {
Course course = new Course();
course.setId(Integer.parseInt(value));
return course;
}
}
最后我的xhtml页面是:
<h:form>
<p:pickList id="coursesOffered"
value="#{courseView.courseModel}" var="course"
itemValue="#{course}" itemLabel="#{course.courseTitle}"
converter="courseConverter" showSourceFilter="true"
showTargetFilter="true" filterMatchMode="contains">
<f:facet name="targetCaption">Selected</f:facet>
<f:facet name="sourceCaption">All Courses</f:facet>
<p:ajax event="transfer" listener="#{courseView.onTransfer}" />
<p:column style="width:10%">
#{course.courseCode}:
</p:column>
<p:column style="width:90%">
#{course.courseTitle}
</p:column>
</p:pickList>
<p:commandButton id="pojoSubmit" value="Submit"
update="displayPlayers" oncomplete="playerDialog.show()"
style="margin-top:5px" />
<p:dialog showEffect="fade" hideEffect="fade" widgetVar="playerDialog">
<h:panelGrid id="displayPlayers" columns="2">
<h:outputText value="Source: " style="font-weight:bold" />
<ui:repeat value="#{courseView.courseModel.source}"
var="course">
<h:outputText value="#{course.courseTitle}"
style="margin-right:5px" />
</ui:repeat>
<h:outputText value="Target: " style="font-weight:bold" />
<ui:repeat value="#{courseView.courseModel.target}"
var="course">
<h:outputText value="#{course.courseTitle}"
style="margin-right:5px" />
</ui:repeat>
</h:panelGrid>
</p:dialog>
</h:form>
pickList正确显示,源中填充了数据库中的值,但是,单击该按钮后,即使在界面上传输项目后,对话框也会显示原始源列表值和空目标列表。我错过了什么?
答案 0 :(得分:5)
我发现您的代码存在一些问题。在getter中,您正在重建数据库中的DualList,重置到目前为止您所做的任何更改。
尝试让你得到这样的东西:
public DualListModel<Course> getCourseModel() {
return this.courseModel;
}
在注释为@PostConstruct的方法中,而不是在构造函数+ getter中,从数据库构造和加载列表。
public CourseBean() {}
@PostConstruct
public void init() {
List<Course> target = new ArrayList<Course>();
courseModel.setSource(getCourseList());
courseModel = new DualListModel<Course>(source, target);
}
同样注释你的bean @ViewScoped,所以你不要在每个请求上构造一个带有空目标列表的新bean
@ManagedBean(name="courseView")
@ViewScoped
public class CourseBean {
}
最后你还需要一个二传手:
public void setCourseModel(DualListModel<Course> courseModel) {
this.courseModel = courseModel;
}
我还没有真正研究过这个转换器,当我上次拿到一个选项列表时,我将转换器包含在primefaces展示中(从未尝试过omnifaces)。以下是源代码的链接:http://code.google.com/p/ind/source/browse/indicadorCensoJSF/src/ve/gob/ine/censo/beans/convert/PrimeFacesPickListConverter.java?spec=svn154&r=154
答案 1 :(得分:1)
与接受的答案互补,我的 Omnifaces 列表转换器遇到问题。一切正常,除了已选择的项目不会被更新和“丢失”,而是在视图中存在,但处理的唯一项目是在视图中进行选择,而不是已在其中设置为目标的项目Bean,因此,目标列表只包含在视图中选择的项目,而不是先前设置的项目,而不是包含选择的项目的目标列表以及在doubleList构造函数中设置的项目。
作为解决方案,我还为primefaces组件实现了一个自定义选择列表转换器。现在,一切都像魅力。
我没有具体回答实际问题,因为它已经有了一个可以接受的答案(而且我没有评论的要点)。我只是在补充,因为有些人可能在使用素数2.3和全能3.1时遇到问题。我确实搜索了很多有关所面临问题的信息,但至少没有发现正在发生的情况的提示。
此站点:picklist example上有一个关于如何制作转换器的教程,如果有人有疑问的话。 ACV的答案对转换器也有效,尽管它已经由问问题的Silverfish实施。
答案 2 :(得分:0)
要使用对象,您需要一个转换器。这是如何实现它的最佳答案:https://stackoverflow.com/a/6625392/912829