2013-12-18 2 views
0

저는 primefaces에서 selectOneMenu를 사용하여 mysql 데이터베이스의 데이터를 채 웁니다.하지만 빈 필드가 계속 나타나고 오류가 발생하지 않습니다. 누군가 내가 뭘 잘못하고 있다고 설명 할 수 있습니까?<p : selectOneMenu>에서 jsf2를 사용하여 데이터를 채 웁니다.

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> 

관리 콩 :

내 코드입니다

@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()); 
     } 
    } 

} 

답변

1

문자열을 값 (itemValue="#{points_var.name}")으로 정의하고 구성 요소에 인스턴스가 필요합니다.

이것은 당신이 고려해야 할 변화 중 하나입니다 : 나는 또한 당신이 PointFacade를 사용하여 private List<Point> points;을 채우는하지 않는 것으로 나타났습니다

<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> 

. 대신, 당신은 PointControllerConverter 안에 빈 정적 Map의 값으로 ArrayList를 인스턴스화합니다.

귀하의 질문에 데이터베이스 (MySQL)의 값으로 selectOnMenu를 채우려는 것입니다. 이 경우 전략을 다시 생각해보고 데이터베이스에서 데이터를 가져 오기 위해 PointFacade와 같은 일부 EJB를 사용해야합니다.

+0

나는 그것을 시도했지만 성공하지 못했습니다. – user506246

+0

어떻게 PointControllerConverter를 등록 했습니까? –

+0

@FacesConverter (forClass = Point.class) – user506246

0

var, itemValue, itemLabel 속성을 사용하지 않고 한 번 확인하고 getter 자체에 쿼리를 작성할 수도 있습니다.

관련 문제