Jsf 2 Primefaces选择器列表中的转换器
我在使用Primefaces的选择列表,但我无法让它工作。我的问题是转换器。我听从了另一个帖子的指示,但徒劳无功 这是我的脸Jsf 2 Primefaces选择器列表中的转换器,jsf-2,primefaces,converter,Jsf 2,Primefaces,Converter,我在使用Primefaces的选择列表,但我无法让它工作。我的问题是转换器。我听从了另一个帖子的指示,但徒劳无功 这是我的脸 <p:pickList value="#{customerBean.preferredCategories}" var="category" itemLabel="#{category.description}" itemValue="#{category}" converter="#{categoryConverter}"> </p:pickLi
<p:pickList value="#{customerBean.preferredCategories}" var="category"
itemLabel="#{category.description}" itemValue="#{category}" converter="#{categoryConverter}">
</p:pickList>
类别由一个id(int)和一个描述(String)组成
我希望源列表和目标列表都显示描述字符串,并将所选类别设置为我的bean中的类别列表。这两个列表都正确加载到bean中,DualListModel填充在preferredCategories中。问题是拾取列表甚至没有呈现。什么都没有发生,没有显示错误,当轮到PickList时页面停止渲染,我认为这是因为转换器使用错误。在这个案例中,哪种方法是正确的
谢谢。在这行:
@FacesConverter(forClass=CategoryLevelView.class,value="categoryLevelConverter")
看起来您正在尝试将转换器id设置为categoryLevelConverter
在Facelet的这一行中:
converter="#{categoryConverter}"
转换器id不匹配。我认为
@FacesConverter(forClass=CategoryLevelView.class,value="categoryConverter")
public class CategoryConverter implements Converter {
应该是
@FacesConverter(forClass=Category.class,value="categoryConverter")
public class CategoryConverter implements Converter {
将class的值更改为Category.class
而且,您不需要在中提及转换器
属性的值。我不知道您是否已经解决了问题,但如果没有,您可以尝试一下。
在getAsObject
方法中,您要做的是创建一个新的类别对象,设置其id并返回它。我认为您应该在这里使用该id从数据库中获取类别,然后返回该类别。我制作了一个简单的转换器,它可以很好地处理Primefaces PickList中的所有值:
@facescoverter(“PickListConverter”)
公共类PickListConverter实现转换器{
公共对象getAsObject(FacesContext FacesContext、UIComponent组件、字符串submittedValue){
picklistp=(PickList)组件;
DualListModel dl=(DualListModel)p.getValue();
返回dl.getSource().get(Integer.valueOf(submittedValue));
}
公共字符串getAsString(FacesContext FacesContext、UIComponent组件、对象值){
picklistp=(PickList)组件;
DualListModel dl=(DualListModel)p.getValue();
返回字符串.valueOf(dl.getSource().indexOf(value));
}
}
此操作不会出现ArrayIndexOutOfBounds异常
@FacesConverter("PickListConverter")
public class PickListConverter implements Converter {
public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue) {
PickList p = (PickList) component;
DualListModel dl = (DualListModel) p.getValue();
for (int i = 0; i < dl.getSource().size(); i++) {
if (dl.getSource().get(i).toString().contentEquals(submittedValue)) {
return dl.getSource().get(i);
}
}
for (int i = 0; i < dl.getTarget().size(); i++) {
if (dl.getTarget().get(i).toString().contentEquals(submittedValue)) {
return dl.getTarget().get(i);
}
}
return null;
}
public String getAsString(FacesContext facesContext, UIComponent component, Object value) {
PickList p = (PickList) component;
DualListModel dl = (DualListModel) p.getValue();
// return String.valueOf(dl.getSource().indexOf(value));
return value.toString();
}
}
@facescoverter(“PickListConverter”)
公共类PickListConverter实现转换器{
公共对象getAsObject(FacesContext FacesContext、UIComponent组件、字符串submittedValue){
picklistp=(PickList)组件;
DualListModel dl=(DualListModel)p.getValue();
对于(int i=0;i
您可以在任何答案下添加注释。只需单击显示“添加注释”的链接即可。此代码使用选取列表的索引(0、1、2等)来标识哪些选取列表项已从源移动到目标。虽然这可能是处理picklist和转换器的最简单、最优雅的方法,getSource.indexOf(value)
有时返回-1(当value
已经在Target中时),因此在getAsObject
中会出现ArrayIndexOutOfBounds
异常。我想知道作者是如何实现这个功能的。
@FacesConverter("PickListConverter")
public class PickListConverter implements Converter {
public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue) {
PickList p = (PickList) component;
DualListModel dl = (DualListModel) p.getValue();
for (int i = 0; i < dl.getSource().size(); i++) {
if (dl.getSource().get(i).toString().contentEquals(submittedValue)) {
return dl.getSource().get(i);
}
}
for (int i = 0; i < dl.getTarget().size(); i++) {
if (dl.getTarget().get(i).toString().contentEquals(submittedValue)) {
return dl.getTarget().get(i);
}
}
return null;
}
public String getAsString(FacesContext facesContext, UIComponent component, Object value) {
PickList p = (PickList) component;
DualListModel dl = (DualListModel) p.getValue();
// return String.valueOf(dl.getSource().indexOf(value));
return value.toString();
}
}