Ayman S
Ayman S

Reputation: 247

lazy datatable's rowselect event object is always null

I'm trying to use the p:datatable to list a previously search result and then select a row to get displayed on a show dialog (as shown in showcase, http://www.primefaces.org/showcase/ui/data/datatable/lazy.xhtml). But SelectEvent.getObject() of ajax event "rowSelect" returns always null and current row is never selected.

This is the stack trace:

Caused by: java.lang.NullPointerException
    at com.gestion.projet.web.jsf.ProjetComponentImpl.onRowSelect(ProjetComponentImpl.java:92)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    at $Proxy58.onRowSelect(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)
    at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    at $Proxy10.onRowSelect(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.el.parser.AstValue.invoke(AstValue.java:234)
    ... 38 more

This is my xhtml file:

<p:dataTable var="current" value="#{ProjetComponent.lazyModel}" 
                paginator="true" rows="10" 
                paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
                rowsPerPageTemplate="5,10,15" selectionMode="single"
                selection="#{ProjetComponent.projet}" id="projetTable" lazy="true">
                <p:ajax event="rowSelect" listener="#{ProjetComponent.onRowSelect}"
                    update=":form:projetDetail" oncomplete="PF('projetDialog').show()" />
                <p:column headerText="Id" sortBy="#{current.idprojet}" filterBy="#{current.idprojet}">
                    <h:outputText value="#{current.idprojet}" />
                </p:column>
                <p:column headerText="Nom" sortBy="#{current.nomprojet}"
                    filterBy="#{current.nomprojet}">
                    <h:outputText value="#{current.nomprojet}" />
                </p:column>

            </p:dataTable>

And this is the method onRowSelect on ProjetComponent who contain the line 92:

@Scope("session")
@Component("ProjetComponent")

public class ProjetComponentImpl implements ProjetComponent {

    private Projet projet;

    @Autowired
    private ProjetService projetService;

    private LazyDataModel<Projet> lazyModel;
    /** 
     */
    public ProjetComponentImpl() {
    }





    @PostConstruct
        public void init() {
            //initialize the data here
            this.phases = new Phase();
            //similar for other fields
            this.utilisateurs =new Utilisateur();
            this.projet=new Projet();
            this.lazyModel = new LazyProjetDataModel(projetService.findAllProjets(-1, -1));
        }

    @Transactional
     public LazyDataModel<Projet> getLazyModel() {
        this.lazyModel = new LazyProjetDataModel(projetService.findAllProjets(-1, -1));

        return lazyModel;
    }

     @Transactional
    public void setLazyModel(LazyDataModel<Projet> lazyModel) {
        this.lazyModel = lazyModel;
    }
@Transactional
    public void onRowSelect(SelectEvent event) {
    if (event != null){

            FacesMessage msg = new FacesMessage("Projet Selected", ((Projet) event.getObject()).getIdprojet().toString());//Line 92
            FacesContext.getCurrentInstance().addMessage(null, msg);
    }   }
}

and this the LazyProjetDataModel:

public class LazyProjetDataModel extends LazyDataModel<Projet>  {
    private static final long serialVersionUID = 1L;
    private List<Projet> datasource;

    public LazyProjetDataModel(List<Projet> datasource) {
        this.datasource = datasource;
    }

    @Override
    public Projet getRowData(String rowKey) {
        for(Projet projet : datasource) {
            if(projet.getIdprojet().equals(rowKey))
                return projet;
        }

        return null;
    }

    @Override
    public Object getRowKey(Projet projet) {
        return projet.getIdprojet();
    }
    @Override
    public List<Projet> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
        List<Projet> data = new ArrayList<Projet>();

        //filter
        for(Projet car : datasource) {
            boolean match = true;

            if (filters != null) {
                for (Iterator<String> it = filters.keySet().iterator(); it.hasNext();) {
                    try {
                        String filterProperty = it.next();
                        Object filterValue = filters.get(filterProperty);
                        String fieldValue = String.valueOf(car.getClass().getField(filterProperty).get(car));

                        if(filterValue == null || fieldValue.startsWith(filterValue.toString())) {
                            match = true;
                    }
                    else {
                            match = false;
                            break;
                        }
                    } catch(Exception e) {
                        match = false;
                    }
                }
            }

            if(match) {
                data.add(car);
            }
        }

        //sort
        if(sortField != null) {
       //     Collections.sort(data, new LazySorter(sortField, sortOrder));
        }

        //rowCount
        int dataSize = data.size();
        this.setRowCount(dataSize);

        //paginate
        if(dataSize > pageSize) {
            try {
                return data.subList(first, first + pageSize);
            }
            catch(IndexOutOfBoundsException e) {
                return data.subList(first, first + (dataSize % pageSize));
            }
        }
        else {
            return data;
        }
    }
}

this is the screenshot of datatable: enter image description here and this is what i get when i select a row: enter image description here

Upvotes: 3

Views: 3040

Answers (2)

sghaier ali
sghaier ali

Reputation: 443

your problem is this methode return null

 @Override
    public Projet getRowData(String rowKey) {
        for(Projet projet : datasource) {
            if(projet.getIdprojet().equals(rowKey))
                return projet;
        }

        return null;
    }

delete it and try

Upvotes: 1

sghaier ali
sghaier ali

Reputation: 443

Hy,

your error is:

Caused by: java.lang.NullPointerException
at com.gestion.projet.web.jsf.ProjetComponentImpl.onRowSelect(ProjetComponentImpl.java:92)

is caused by

((Projet) event.getObject()).getIdprojet().toString()

your object projet is not null. the null object is the idProject. go to your projet and verify if he has id valorized

Upvotes: 0

Related Questions