2013-05-30 3 views
1

Я пытаюсь использовать компонент pickList для Primefaces. Мой конвертер работает неправильно, и я не знаю, почему.PickList PrimeFaces не работает

Это мой ManagedBean:

@ManagedBean(name = "comMB") 
@SessionScoped 
public class TeamCompetitionBean implements Serializable { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    private DualListModel<Team> teams; 
    List<Team> source; 
    List<Team> source1; 
    List<Team> target; 

    @ManagedProperty("#{team}") 
    private TeamServiceI teamService; 

    List<String> teamNameList ; 

    // public TeamCompetitionBean() { 

    public DualListModel<Team> getTeams() { 

     // Players 
     teamNameList = new ArrayList<String>(); 
     source = new ArrayList<Team>(); 
     target = new ArrayList<Team>(); 

     source.addAll(getTeamService().getTeam()); 

     teams = new DualListModel<Team>(source, target); 
     return teams; 

    } 

    public void setTeams(DualListModel<Team> teams) { 
     this.teams = teams; 
    } 

    public void onTransfer(TransferEvent event) { 
     StringBuilder builder = new StringBuilder(); 
     for (Object item : event.getItems()) { 
      builder.append(((Team) item).getTeamName()).append("<br />"); 
     } 

     FacesMessage msg = new FacesMessage(); 
     msg.setSeverity(FacesMessage.SEVERITY_INFO); 
     msg.setSummary("Items Transferred"); 
     msg.setDetail(builder.toString()); 

     FacesContext.getCurrentInstance().addMessage(null, msg); 
    } 

    public TeamServiceI getTeamService() { 
     return teamService; 
    } 

    public void setTeamService(TeamServiceI teamService) { 
     this.teamService = teamService; 
    } 

    public List<Team> getSource() { 

     return source; 
    } 

    public void setSource(List<Team> source) { 
     this.source = source; 
    } 

    public List<Team> getTarget() { 
     return target; 
    } 

    public void setTarget(List<Team> target) { 
     this.target = target; 
    } 


    public void afficher(){ 
     System.out.println(target); 
     System.out.println(source); 
    } 

} 

и это моя сущность класс, который я хотел бы загрузить в моем PickList:

@Entity 
@Table(name = "team", catalog = "competition_manager") 
public class Team implements java.io.Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private Integer idTeam; 
    private Stadium stadium; 
    private League league; 
    private String teamName; 

// getters and setters 

@Override 
    public String toString() { 
     return teamName.toString(); 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (!(obj instanceof Team)) { 
     return false; 
     } 
     Team f = (Team) obj; 

     return (this.idTeam == f.getIdTeam()); 

    } 

Теперь это мой пользовательский конвертер:

@FacesConverter(forClass = Team.class, value = "teamConverter") 
public class TeamConverter implements Converter { 


    Team team; 

    public Object getAsObject(FacesContext facesContext, UIComponent component, 
      String value) { 

     System.out.println("hello object"); 

     if (value == null || value.length() == 0) { 
      return null; 
     } 
     ApplicationContext ctx = FacesContextUtils 
       .getWebApplicationContext(FacesContext.getCurrentInstance()); 
     TeamBean controller = (TeamBean) ctx.getBean("teamMB"); 

     List<Team> liststagiaire = controller.getTeamList(); 

     for (int i = 0; i < liststagiaire.size(); i++) 

     { 
      team = liststagiaire.get(i); 
      if (team.getIdTeam() == getKey(value)) { 
       break; 
      } 

     } 

     return team; 
    } 

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

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

    public String getAsString(FacesContext facesContext, UIComponent component, 
      Object object) { 

     System.out.println("hello string"); 

     if (object == null) { 
      System.out.println("hello string null"); 
      return null; 
     } 
     if (object instanceof Team) { 
      System.out.println("hello string intance of"); 
      Team o = (Team) object; 
      String i = getStringKey(o.getIdTeam()); 

      return i; 
     } else { 
      System.out.println("hello throw"); 
      throw new IllegalArgumentException("object " + object 
        + " is of type " + object.getClass().getName() 
        + "; expected type: " + Team.class.getName()); 
     } 
    } 

} 

И, наконец, это моя страница XHTML:

<p:pickList id="teamPickList" value="#{comMB.teams}" var="team" 
      itemValue="#{team}" itemLabel="#{team}" converter="teamConverter">   
     </p:pickList> 
+1

Что значит «мой конвертер не работает должным образом»? Он не называется? Возвращает ли оно неправильное значение? Также когда «List teamNameList' инициализирован? Я не вижу этого. –

+0

Не связано с проблемой, но вы можете заменить 'String i = getStringKey (o.getIdTeam());' byString i = o.getIdTeam(). ToString(); ' –

+0

Мне очень жаль, похоже, что i не обращал внимания на мой код .. на самом деле Список teamNameList бесполезен .... я не использую его сейчас. –

ответ

0

Ваша проблема пришедшая от этой линии (в классе TeamConverter):

if (team.getIdTeam() == getKey(value)) { 

Вы не можете сравнивать Integer объектов, как это, потому что делать, как это вы сравниваете reference. Вы должны заменить эту строку

if (team.getIdTeam().intValue() == getKey(value).intValue()) { 

У вас есть та же самая проблема в классе Team:

return (this.idTeam == f.getIdTeam()); 

следует заменить:

return (this.idTeam.intValue() == f.getIdTeam().intValue()); 

Не относится:

Вам не нужно использовать getKey и getStringKey, вы можете заменить их просто так:

getKey(value) // this 

Integer.valueOf(value) // by this 

и

getStringKey(o.getIdTeam()) // this 

o.getIdTeam().toString() // by this 

Кроме того, вы должны заменить itemLabel="#{team}" на itemLabel="#{team.teamName}" на ваш взгляд.

+0

Благодарим вас за ответ, но он все еще не работает. посмотрите на исключение: object [email protected] имеет тип com.sun.proxy. $ Proxy690; ожидаемый тип: com.arobase.model.Team –

+0

@ user2436180 Я отредактировал ответ, который я нашел, другие вещи, на которые вы должны обратить внимание. Ваше исключение не было опубликовано раньше?Не могли бы вы указать, какая линия поднимает это исключение? Также я не вижу в вашем вопросе какого-либо класса TeamServiceImpl. –

+0

Я отредактировал свой код, как вы предполагали ... но проблема все еще не решена. Это исключение из стека Trace: java.lang.IllegalArgumentException: объект [email protected] имеет тип com.sun.proxy. $ Proxy863; ожидаемый тип: com.arobase.model.Team \t at com.arobase.managed.bean.TeamConverter.getAsString (TeamConverter.java:79) –

Смежные вопросы