автозаполнение простых лиц с помощью pojo

Я читал на SO некоторые QA об одном и том же компоненте, но чувствую, что что-то упускаю, потому что я на шаг позади. Я даже не могу открыть страницу при использовании в ней компонента автозаполнения простых лиц. Фрагмент для него:

<p:autoComplete value="#{indirizzoCtrl.selectedCodiceNazione}"  
            completeMethod="#{indirizzoCtrl.completeNazione}"  
            var="nazione" itemLabel="#{nazione.nome}"   
            itemValue="#{nazione.codiceNazione}" />

Nazione - это класс Pojo, где CodiceNazione и Nome are два поля String (обязательно с геттером и сеттером). completeNazione — это метод ManagedBean, который возвращает List<Nazione>. Глядя на объяснение BalusC здесь, мне кажется, что мне не нужен какой-либо преобразователь, потому что атрибуты itemValue и value сопоставляются со строковым свойством. В любом случае, когда я просто открываю страницу, содержащую этот фрагмент автозаполнения, он вылетает с этой ошибкой:

javax.el.PropertyNotFoundException: /Cliente/Indirizzo.xhtml @23,56 itemValue="#{nazione.codiceNazione}": itemValue="#{nazione.codiceNazione}": Property 'codiceNazione' not found on type java.lang.String

Почему это происходит? Я действительно не могу понять. Метод completeNazione еще даже не вызывался, поэтому он еще не должен знать никаких Nazione. Что с этим не так?

Отредактировано: Следуя предложению, я попытался добавить конвертер, но по-прежнему получаю ту же ошибку. Вот мой преобразователь:

    public class NazioneConverter implements Converter {

    final static Logger log = Logger.getLogger(NazioneConverter.class);

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if (value.trim().equals("")) {  
            return null;  
        } else {  
            try {  
                IndirizzoRepository ir = new IndirizzoRepository();
                List<Nazione> nazioni = ir.getNazioneByName(value);
                if (nazioni.size()==1) return nazioni.get(0);
                else throw new Exception();

            } catch (Exception e) {
                String msg = "Errore di conversione";
                log.error(msg, e);
                throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, "Non è una nazione conosciuta"));  
            }  
        }          
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        if (value == null || value.equals("")) {  
            return "";  
        } else {  
            return String.valueOf(((Nazione) value).getNome());  
        } 
    }

}

теперь компонент в представлении выглядит так:

<p:autoComplete value="#{indirizzoCtrl.indirizzo.nazione.codiceNazione}"  
            completeMethod="#{indirizzoCtrl.completeNazione}"  
            var="nazione" itemLabel="#{nazione.nome}" converter="#{nazioneConverter}"
            itemValue="#{nazione.codiceNazione}" forceSelection="true"  />

Но все равно не работает. Конвертер даже не вызывается: я прописал его в свой файлfaces-config.xml. Я также попробовал itemValue="#{nazione}", как в примере с Primefaces, но проблема заключалась в атрибуте ItemLabel, сопоставленном с nazione.nome. Что я делаю неправильно?


person themarcuz    schedule 19.12.2011    source источник
comment
Какая версия ПФ? Хорошо ли работают другие компоненты PF в том же представлении?   -  person BalusC    schedule 19.12.2011
comment
@BalusC: версия 2.2, а все остальное работает нормально   -  person themarcuz    schedule 19.12.2011
comment
Что за сообщение об ошибке после добавления конвертера?   -  person Bhesh Gurung    schedule 19.12.2011
comment
@gurung: точно так же. Если я напишу itemValue="#{nazione.codiceNazione}", то сообщение об ошибке точно такое же. Если я изменю его на itemValue="#{nazione}", то будет выдана точно такая же ошибка, но со ссылкой на itemLabel="#{nazione.nome}". На практике он не может вытащить свойство из объекта nazione.   -  person themarcuz    schedule 19.12.2011
comment
@themarcuz Кто-нибудь разобрался с этой проблемой? У меня точно такая же проблема. Я изучал этот вопрос и не думаю, что нам нужен конвертер, так как поле значения автозаполнения является строкой, а не POJO. Буду очень признателен за ответ!   -  person INElutTabile    schedule 05.11.2014


Ответы (4)


Это сработало для меня:

//Converter
@FacesConverter(value="MarcaConverter")
public class MarcaConverter implements Converter{
    MarcaDAO marcaDAO;
    public Object getAsObject(FacesContext contet, UIComponent component, String value) {
        if(value==null || value.equals(""))
            return null;
        try{
            int id = Integer.parseInt(value);
            return marcaDAO.findMarcaById(id);
        }catch (Exception e) {
            e.printStackTrace();
            throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Marca no válida", ""));
        }
    }

    public String getAsString(FacesContext contet, UIComponent component, Object value) {
        if(value==null || value.equals(""))
            return null;
        return String.valueOf(((Marca)value).getCodigoMarca());
    }
}




//--------------------------------------
//Bean
@ManagedBean
@ViewScoped
public class MyBeans implements Serializable{
    private Marca marca;
    ...
    public Marca getMarca(){
        return marca;
    }
    public void setMarca(Marca m){
        marca=m;
    }
    ...
    public List<Marca> obtenerMarcasVehiculos(String s) {
        List<Marca> marcas,smarcas=new ArrayList<Marca>();
        try{
            marcas= marcaDAO.findAllMarcas();
            if(s.trim().equals("")) return marcas;
            for(Marca m:marcas)
                if (m.getNombreMarca().toString().contains(s) || m.getNombreMarca().toLowerCase().contains(s.toLowerCase())) {
                    smarcas.add(m);
                }
            return smarcas;
        }catch(Exception e){
            //JsfUtil.showFacesMsg(e,"Error al obtener las marcas de veh&iacute;culos","",FacesMessage.SEVERITY_WARN);
            e.printStackTrace();
            JsfUtil.lanzarException(e);
            return null;
        }
    }


//-----------------------------------------
//*.xhtml page
...
    <p:autoComplete 
       id="cbxMarca" value="#{myBean.marca}" size="40"
       converter="MarcaConverter"
       completeMethod="#{myBean.obtenerMarcasVehiculos}"
       var="m" itemLabel="#{m.nombreMarca}" itemValue="#{m}"
       forceSelection="true" dropdown="true"
       required="true" scrollHeight="200">
    </p:autoComplete>
...

//-----------------------------------------
//Class Marca
public class Marca implements Serializable{
       private static final long serialVersionUID = 1L;

    private Integer codigoMarca;
    private String nombreMarca;
        ...
person Fabrizzio    schedule 07.06.2013

Вы читали руководство пользователя? http://www.primefaces.org/documentation.html

Я должен сказать, что никогда не использовал автозаполнение с pojo, но из того, что я прочитал в руководстве пользователя, Чагатай Чивичи говорит там:

Обратите внимание, что при работе с pojos вам необходимо подключить собственный конвертер.

Здесь вы можете узнать, что конвертер (PlayerConverter) реализован, даже если player.name и другие реквизиты являются строками.

Я признаю, что это интересно, и я проведу некоторые исследования, но сейчас у меня нет необходимого времени...

person spauny    schedule 19.12.2011
comment
Я прочитал руководство пользователя, но, прочитав этот пост от BalusC stackoverflow.com/a/7653775/333223, понял, что могу избегайте преобразователя в моем случае... но, возможно, я что-то неправильно понял... - person themarcuz; 19.12.2011
comment
@themarcuz добавьте простой конвертер и убедитесь сами... Вы не сможете научиться программированию без практики! - person spauny; 19.12.2011
comment
обязательно сделаю... Просто сейчас занят другим заданием, но через пару часов постараюсь, чтобы все заработало, как было предложено - person themarcuz; 19.12.2011
comment
@themarcuz Молодец! Сообщите мне о результатах. Я даже попробую сам, но, может быть, завтра... - person spauny; 19.12.2011
comment
Добавлена ​​новая информация... Пробовал с конвертером, ничего не меняется :( - person themarcuz; 19.12.2011

Изменить converter="#{nazioneConverter}" на converter="nazioneConverter" в autocomplete

person Marlon    schedule 30.03.2012

Измените itemValue с itemValue="#{nazione.codiceNazione}" на itemValue="#{nazione}" в автозаполнении.

person Mustafa    schedule 23.02.2012