Список выбора 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);
    }

}

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

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

person NiÑo    schedule 30.05.2013    source источник
comment
Что это значит, что мой преобразователь не работает должным образом? Не вызывается? Возвращает неправильное значение? Также когда инициализируется List<String> teamNameList? Я не могу этого видеть.   -  person Balázs Németh    schedule 30.05.2013
comment
Не имеет отношения к проблеме, но вы можете заменить String i = getStringKey(o.getIdTeam()); на String i = o.getIdTeam().toString();   -  person Alexandre Lavoie    schedule 30.05.2013
comment
извините, кажется, я не обратил внимания на свой код.. на самом деле List‹String› teamNameList бесполезен…. я не использую его сейчас.   -  person NiÑo    schedule 30.05.2013
comment
@Alexander Lavoie: getStringKey не принимает параметр String   -  person NiÑo    schedule 30.05.2013
comment
Когда вместо SSCCE публикуется стена кода, лучше четко указать, что не работает с точки зрения разработчика, а не с точки зрения конечного пользователя. Отслеживайте выполнение кода шаг за шагом, пока не произойдет что-то неожиданное, а затем подробно опишите это неожиданное событие вместе с ожиданием.   -  person BalusC    schedule 30.05.2013


Ответы (1)


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

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

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

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}" в своем представлении.

person Alexandre Lavoie    schedule 30.05.2013
comment
Спасибо за ваш ответ, но он все еще не работает. посмотрите на возникшее исключение: объект com.arobase.service.Impl.TeamServiceImpl@501787f1 имеет тип com.sun.proxy.$Proxy690; ожидаемый тип: com.arobase.model.Team - person NiÑo; 30.05.2013
comment
@user2436180 user2436180 Я отредактировал ответ. Я нашел другие вещи, на которые вам следует обратить внимание. Ваше исключение раньше не поднималось? Не могли бы вы указать, какая строка вызывает это исключение? Также я не вижу никакого класса TeamServiceImpl в вашем вопросе. - person Alexandre Lavoie; 30.05.2013
comment
Я отредактировал свой код, как вы предложили... но проблема все еще не решена. Это исключение из стека. ожидаемый тип: com.arobase.model.Team в com.arobase.managed.bean.TeamConverter.getAsString(TeamConverter.java:79) - person NiÑo; 30.05.2013
comment
@user2436180 user2436180 Вы пытались удалить свою проверку instanceof Team? - person Alexandre Lavoie; 30.05.2013
comment
когда я удаляю его, исключение становится: java.lang.ClassCastException: com.sun.proxy.$Proxy176 не может быть приведен к com.arobase.model.Team в com.arobase.managed.bean.TeamConverter.getAsString(TeamConverter.java: 73) - person NiÑo; 30.05.2013
comment
Эта проблема возникает из-за того, что вы вставляете в эту строку: source.addAll(getTeamService().getTeam()); нужно будет посмотреть, что возвращает эта функция. - person Alexandre Lavoie; 30.05.2013
comment
также, когда я пытаюсь загрузить список команд, не устанавливая конвертер, я получаю список кодов, таких как com.arobase.service.impl.TeamServiceImpl@3ef5 - person NiÑo; 30.05.2013
comment
относительно source.All(getTeamService().getTeam()); TeamService — это интерфейс сервисного уровня, getTeam — это метод, который возвращает список всех команд из базы данных. я попытался отобразить содержимое источника List в обычном datatable и получил правильный список команд с именами и инициалами (я могу отобразить любой атрибут из этого списка) - person NiÑo; 30.05.2013
comment
Ваша проблема точно из-за него, возможно, вам нужно преобразовать его в List<Team>, getTeamService().getTeam() возвращает что-то еще, может быть, List<TeamServiceImpl>. - person Alexandre Lavoie; 30.05.2013
comment
как я могу преобразовать его? не могли бы вы объяснить мне больше, пожалуйста? - person NiÑo; 30.05.2013
comment
Опубликуйте свою функцию getTeam() в вопросе, я проверю, что вам нужно сделать. - person Alexandre Lavoie; 30.05.2013
comment
это мой метод getTeam, помещенный в мой слой DAO @SuppressWarnings("unchecked") public List<Team> getTeam() { List<Team> list = getSessionFactory().getCurrentSession() .createQuery("from Team").list(); return list; } - person NiÑo; 31.05.2013
comment
@user2436180 user2436180 Я предлагаю вам использовать отладчик и отследить строку source.addAll(getTeamService().getTeam());, ваша ошибка исходит из чего-то внутри нее. Я мало чем могу помочь, так как я не сижу перед вашим компьютером, и я думаю, что многое сделал, я указал на много ошибок в вашем коде. - person Alexandre Lavoie; 31.05.2013
comment
можете ли вы дать мне свой идентификатор Skype, если вы хотите, конечно, мне очень важно решить эту проблему. может быть, когда я поделюсь своим экраном, чтобы вы могли посмотреть на мой код, вам будет легче найти проблему. Что касается моего метода getTeam(), убедитесь, что он дает правильный список объектов... как я сказал, я тестирую отображение этого списка в таблице данных, и я получил правильный список - person NiÑo; 31.05.2013
comment
@user2436180 Мне это не нравится, но ты можешь добавить меня на этот раз ... lavoie.alexandre - person Alexandre Lavoie; 31.05.2013