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

时间:2014-06-06 12:28:36

标签: java jsf primefaces nullpointerexception jsf-2.2

我正在尝试使用p:datatable列出以前的搜索结果,然后选择要在显示对话框中显示的行(如展示,http://www.primefaces.org/showcase/ui/data/datatable/lazy.xhtml所示)。 但是,SelectEvent.getObject() ajax事件“rowSelect”始终返回null,并且永远不会选中当前行。

这是堆栈跟踪:

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

这是我的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>

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

这是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;
        }
    }
}

这是数据表的截图: enter image description here 这是我选择一行时得到的: enter image description here

2 个答案:

答案 0 :(得分:1)

你的问题是这个方法返回null

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

        return null;
    }

删除它并尝试

答案 1 :(得分:0)

HY,

你的错误是:

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

是由

引起的
((Projet) event.getObject()).getIdprojet().toString()

您的对象项目不是null。 null对象是idProject。 转到您的项目并验证他是否具有id valorized