使用jsf2 </p:selectonemenu>在<p:selectonemenu>中填充数据库中的数据

时间:2013-12-18 13:00:46

标签: mysql jsf java-ee primefaces

  

我使用来自primefaces的selectOneMenu来填充mysql数据库中的数据,但我经常得到空字段,我没有收到任何错误。   有人可以解释我做错了什么吗?

     

这是我的代码:

xhtml文件:

    <p:selectOneMenu id="point" value="#{pointController.selectedPoint}"
                     var="items_var"> 

         <f:selectItems value="#{pointController.points}" var="points_var" 
                        itemLabel="#{points_var.name}" itemValue="#{points_var.name}"/>

    </p:selectOneMenu>

管理bean:

    @ManagedBean(name = "pointController")
    @SessionScoped

    public class PointController implements Serializable {

    @EJB
        private ethoam.entity.PointFacade ejbFacade;
        private List<point> points;
        private point selectedPoint;
        private point[] selectedPoints;
        private List<Point> selectedPointsList;
        private SelectItem[] PointNamesOptions;

        public PointController() {
                  this.initList();
        }

        @PostConstruct
        private void initList() {

        points = new ArrayList<point>(pointControllerConverter.getPoints().values());


    }

        // getters setters
     }

转换器类:

    public static class PointControllerConverter implements Converter {

    @PersistenceContext(unitName = "PointPU")
    private static EntityManager ejbfacade;

    public static Map<String, point> points = new HashMap<String, point>();

    public Map<String,point> getPoints() {

    points = (Map<String, point>) ejbfacade.getEntityManager().createNamedQuery("SELECT d FROM point d WHERE d.name = :name");
    return points;
    }

    @Override
    public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
        if (value == null || value.length() == 0) {
            return null;
        }
        PointController controller = (PointController) facesContext.getApplication().getELResolver().
                getValue(facesContext.getELContext(), null, "pointController");
        return controller.ejbFacade.find(getKey(value));
    }

    java.lang.Integer getKey(String value) {
        java.lang.Integer key;
        key = Integer.valueOf(value);
        return key;
    }

    String getStringKey(java.lang.Integer value) {
        StringBuilder sb = new StringBuilder();
        sb.append(value);
        return sb.toString();
    }

    @Override
    public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
        if (object == null) {
            return null;
        }
        if (object instanceof point) {
            point o = (point) object;
            return getStringKey(o.getIdPoint());
        } else {
            throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: " + Point.class.getName());
        }
    }

}

2 个答案:

答案 0 :(得分:1)

您正在将String定义为值(itemValue="#{points_var.name}"),并且您的组件期望的实例。

这是您需要考虑的其中一项变更:

<p:selectOneMenu id="point" value="#{pointController.selectedPoint}" var="items_var"> 
    <f:selectItems value="#{pointController.points}" var="points_var" itemLabel="#{points_var.name}" itemValue="#{points_var}"/>
</p:selectOneMenu>

我还注意到您没有使用 PointFacade 填充private List<Point> points;。相反,您使用PointControllerConverter中的空静态Map实例化ArrayList。

您的问题表明您正在尝试使用数据库(MySQL)中的值填充selectOnMenu。在这种情况下,您需要重新考虑策略并开始使用某些EJB(如PointFacade)从数据库中获取数据。

答案 1 :(得分:0)

选中一次而不使用属性 - var,itemValue,itemLabel,您也可以尝试在getter中编写查询。