简体   繁体   English

lazy datatable的rowselect事件对象始终为null

[英]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 ). 我正在尝试使用p:datatable列出以前的搜索结果,然后选择要在显示对话框中显示的行(如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. 但是ajax事件“rowSelect”的SelectEvent.getObject()返回始终为null并且永远不会选择当前行。

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: 这是我的xhtml文件:

<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: 这是包含第92行的onRowSelect上的ProjetComponent方法:

@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 : 这就是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: 这是数据表的截图: 在此输入图像描述 and this is what i get when i select a row: 这是我选择一行时得到的: 在此输入图像描述

your problem is this methode return null 你的问题是这个方法返回null

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

        return null;
    }

delete it and try 删除它并尝试

Hy, 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. 你的对象projet不是null。 the null object is the idProject. null对象是idProject。 go to your projet and verify if he has id valorized 去你的项目并验证他是否已经获得了自己的价值

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM