Primefaces如何从selectOneMenu获取POJO

时间:2014-01-25 10:36:51

标签: ajax primefaces

我的问题是如何从'selectOneMenu'组件中的选择中获取价值。我使用POJO而不是String类型。我尝试在inputText中显示所选对象的name属性。我使用commandButton来刷新inputText中的值,如下面的代码所示。但问题是inputText中没有任何内容。我不确定是否需要使用转换器,但我尝试过它也没有用。

这是我的.jsp文件:

<p:selectOneMenu value="#{appointentBean.selectedSpecialization}">
    <f:selectItems value="#{appointentBean.specializationResult}" var="i" itemValue="#{i}" itemLabel="#{i.name}"/>
</p:selectOneMenu>

<p:commandButton value="Szukaj" >
    <p:ajax update="textid" />
</p:commandButton>

<p:inputText id="textid" value="#{appointentBean.selectedSpecialization.name}" />

appointmentBean:

@ManagedBean
@ViewScoped
@SessionScoped
public class appointentBean
{

private ArrayList<Specialization> specializationResult;
private Specialization selectedSpecialization;

  public ArrayList<Specialization> getSpecializationResult()
  {
    //Here retrievie objects list from database and it works

    return specializationResult;
  }

  public void setSpecializationResult(ArrayList<Specialization> result) {
    this.specializationResult = result;
  }

  public Specialization getSelectedSpecialization() {
    return selectedSpecialization;
  }

  public void setSelectedSpecialization(Specialization selectedSpecialization) {
    this.selectedSpecialization = selectedSpecialization;
  }
}

Specialization.java:

@Entity
@Table(name="Specializations")
public class Specialization
{
  @Id
  @GeneratedValue
  private int specialization_id;
  @Column(name="name")
  private String name;


  public int getSpecialization_id() {
    return specialization_id;
  }
  public void setSpecialization_id(int specialization_id) {
    this.specialization_id = specialization_id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}

更重要的是。如果我没有在列表上进行选择,则出现NullPointerExcetion。但是,当我做出选择时,我却没有。因此,在选择后设置对象。

2 个答案:

答案 0 :(得分:3)

像这样给你的Managed Bean命名

1.    @ManagedBean(name ="appointentBean")
2.    It should be in Session Scoped or View Scoped not in Both

您的代码在我的结尾完美运行。

我做了更改
ArrayList<Specialization> getSpecializationResult() like this:

 public ArrayList<Specialization> getSpecializationResult()
  {
    //Here retrievie objects list from database and it works
    specializationResult = new ArrayList<Specialization>();
    Specialization specialize= new Specialization();  
    specialize.setName("Vinayak");
    specialize.setSpecialization_id(1);
    specializationResult.add(specialize);
    return specializationResult;
  }

有效。所以,做出必要的改变并告诉我们。

编辑2

当我们当时处理POJO时,我们必须处理Converter。 为什么自定义转换器的问题是您现在想要问的问题。请参阅Custom Converter

以下是创建自定义转换器的步骤 1.通过实现javax.faces.convert.Converter接口创建转换器类。 2.重写getAsObject()和getAsString()方法。 3.使用javax.annotation中的@FacesConverter注释指定唯一的转换器ID。

  1. 首先,我为您的专业化类

    创建了一个POJOConverter类
    package primefaces1;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.faces.application.FacesMessage;
    import javax.faces.component.UIComponent;
    import javax.faces.context.FacesContext;
    import javax.faces.convert.Converter;
    import javax.faces.convert.ConverterException;
    import javax.faces.convert.FacesConverter;
    
    @FacesConverter(forClass=Specialization.class)
    public class PojoConverter implements Converter{
        public static List<Specialization> specilizationObject;
    
        static {
            specilizationObject = new ArrayList<Specialization>();
            specilizationObject.add(new Specialization("Vinayak", 10));
            specilizationObject.add(new Specialization("Pingale", 9));  
        }
    
        public Object getAsObject(FacesContext facesContext, UIComponent   
        component, String submittedValue) {
            if (submittedValue.trim().equals("")) {
                return null;
            } else {
                try {
                     for (Specialization p : specilizationObject) {
                        if (p.getName().equals(submittedValue)) {
                            return p;
                        }
                    }
    
                } catch(NumberFormatException exception) {
                    throw new ConverterException(new 
                    FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion
                    Error", "Not a valid Specialization"));
                }
            }
    
            return null;
        }
    
        public String getAsString(FacesContext facesContext, UIComponent
        component, Object value) {
            if (value == null || value.equals("")) {
                return "";
            } else {
                return String.valueOf(((Specialization) value).getName());
            }
        }
    }
    
  2. 对您的托管Bean类进行了以下更改。克服NUll指针异常

    package primefaces1;
    
    import java.util.ArrayList;
    
    import javax.annotation.PostConstruct;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.SessionScoped;
    
    @ManagedBean(name = "appointentBean")
    @SessionScoped
    public class appointentBean {
    
    private ArrayList<Specialization> specializationResult;
    private Specialization selectedSpecialization  ;
    
    @PostConstruct
    public void init() {
        selectedSpecialization = new Specialization();
        selectedSpecialization.setName(new String());
        selectedSpecialization.setSpecialization_id(0);
    }
        public appointentBean() {
            specializationResult= (ArrayList<Specialization>) 
                    PojoConverter.specilizationObject;
        }
        public ArrayList<Specialization> getSpecializationResult() {
            // Here retrievie objects list from database 
                    //and it works
            return specializationResult;
        }
    
        public void setSpecializationResult(ArrayList<Specialization> result) {
            this.specializationResult = result;
        }
    
        public Specialization getSelectedSpecialization() {
            if (this.selectedSpecialization != null)
                  System.out.println("getSelectedSpecialization----"
                          + this.selectedSpecialization.getName());
            return this.selectedSpecialization;
        }
    
        public void setSelectedSpecialization(Specialization 
            selectedSpecialization) {       
            this.selectedSpecialization = selectedSpecialization;
        }
    
    }
    
  3. 我对您的xhtml进行了一些微小的更改以显示值。

  4.          

    <h:body>
    
        <h:form id="me">
                <p:selectOneMenu value="#{appointentBean.selectedSpecialization}" >
                    <f:selectItem itemLabel="Select One" itemValue=""></f:selectItem>
                    <f:selectItems value="#{appointentBean.specializationResult}"
                        var="result" itemValue="#{result}" itemLabel="#{result.name}" />
    
                </p:selectOneMenu>
    
                <p:commandButton value="Szukaj" update="me:textid">
                    </p:commandButton>
                <h:outputText value="NAME: "></h:outputText>
                <h:outputText  id="textid" value="#{appointentBean.selectedSpecialization.name}" rendered="#{not empty appointentBean.selectedSpecialization}"/>
    
        </h:form>
    
    </h:body>
    


答案 1 :(得分:0)

我发现自己处于与使用自定义转换器正确填充user2374573 Select2Menu相同的情况,但是所选项目为null。提出的解决方案是自定义转换器的一种变体,但它不能解决问题(至少对我而言)。值选择未按Primefaces文档中所述到达,这是因为SelectOneMenu使用String而不是Pojos进行操作。经过研究,最终我选择了一种中间解决方案。 我没有使用pojo类型的变量来存储值,而是使用了一个String来存储元素的id,如下所示。 此解决方案对于SelectOneMenu以及将Targer加载到Primefaces Picklist中使用的DualList中非常有用。这不是理想的解决方案,但是可以解决问题。

Java视图

public class PickListView  implements Serializable { 
    private static final long serialVersionUID = 1L;
    private List<CviConcesione> listaConcesion;
    private CviConcesione concesionSeleccionada;    
    private String concesionSeleccionadaS;  

    @Autowired
    private ConcesionesBO concesionesBO;    

    @PostConstruct
    public void init() {
    }
     
    public List<CviConcesione> getListaConcesion() {
        if (null != listaConcesion && !listaConcesion.isEmpty()) {
            return listaConcesion;  
        } else {
            listaConcesion = new ArrayList<CviConcesione>();            
            listaConcesion = concesionesBO.consultaTodasConcesiones();
            return listaConcesion;
        }
    }

    public void setListaConcesion(List<CviConcesione> listaConcesion) {
        this.listaConcesion = listaConcesion;
    }

    public ConcesionesBO getConcesionesBO() {
        return concesionesBO;
    }

    public void setConcesionesBO(ConcesionesBO concesionesBO) {
        this.concesionesBO = concesionesBO;
    }

    public CviConcesione getConcesionSeleccionada() {
        return concesionSeleccionada;
    }

    public void setConcesionSeleccionada(CviConcesione concesionSeleccionada) {
        this.concesionSeleccionada = concesionSeleccionada;
    }

    public String getConcesionSeleccionadaS() {
        return concesionSeleccionadaS;
    }

    public void setConcesionSeleccionadaS(String concesionSeleccionadaS) {
        this.concesionSeleccionadaS = concesionSeleccionadaS;
    }
}

用于选择一个菜单的HTML代码

<p:selectOneMenu 
            id="concesionR" 
            value="#{pickListView.concesionSeleccionadaS}" 
            style="width:125px" 
            dynamic="true"
            converter="#{concesionConverter}">
                <f:selectItem itemLabel="Seleccione" itemValue="" />
                <f:selectItems value="#{pickListView.listaConcesion}" 
                    var="concesion" 
                    itemLabel="#{concesion.conCodigo} - #{concesion.conDescripcion}" 
                    itemValue="#{concesion.conCodigo}"
                    ajax = "true"
                 />
                <p:ajax update="lineaR" process="@form" />                           
    </p:selectOneMenu>

a 类转换器

@FacesConverter("concesionConverter")
public class ConcesionesConverter implements Converter {

    public Object getAsObject(FacesContext fc, UIComponent uic, String value) {
        if(value != null && value.trim().length() > 0) {
            try {
                PickListView service = (PickListView) fc.getExternalContext().getApplicationMap().get("pickListView");
                return service.getListaConcesion().get(Integer.parseInt(value));
            } catch(NumberFormatException e) {
                throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error", "Not a valid theme."));
            }
        }
        else {
            return null;
        }
    }

    public String getAsString(FacesContext fc, UIComponent uic, Object object) {
        if(object != null) {
            return String.valueOf(((CviConcesione) object).getConId());
        }
        else {
            return null;
        }
    }   
}

此解决方案无法带来pojo,但会让您知道它已被选中,并显示pojo值。