NullPointerException при попытке перезагрузить IndexedContainer свежими данными

Я пытаюсь «перезагрузить» IndexedContainer новыми свежими данными, но получаю NPE.

У меня есть метод addItemsToContainer(List<Person> persons), который я использую для заполнения своего контейнера.

Допустим, мой список Person содержит 100 объектов person. Когда я сначала вызываю addItemsToContainer(List<Person> persons), мой контейнер заполняется, и все в порядке.

Однако при втором вызове метода я получаю NullPointerException в setValue().

Теперь кажется, что removeAllItems() удалить все элементы, но все ItemId остаются в контейнере. Это означает, что при втором вызове метода первым автоматически сгенерированным ItemId будет 101. Это причина, по которой я получаю NPE? При отладке я вижу, что возвращаю правильное значение из person.getId().

Мой метод addItemsToContainer

public void addItemsToContainer(List<Person> persons) {

    removeAllItems();

    for (Person person : persons) {
        Object itemId = addItem();
        getContainerProperty(itemId, "Id").setValue(person.getId()); // <-- NPE here
        getContainerProperty(itemId, "Name").setValue(person.getName());
    }
}

Трассировка стека (ExampleMainTableContainer.java:94 — это оператор, который я отметил в методе addItemsToContainer)

com.vaadin.server.ServerRpcManager$RpcInvocationException: Unable to invoke method click in com.vaadin.shared.ui.button.ButtonServerRpc
    at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:170)
    at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:118)
    at com.vaadin.server.communication.ServerRpcHandler.handleBurst(ServerRpcHandler.java:214)
    at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:111)
    at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:91)
    at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:37)
    at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1371)
    at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:238)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:168)
    ... 24 more
Caused by: com.vaadin.event.ListenerMethod$MethodException: Invocation of method buttonClick in com.example.myapp.web.view.ExampleView$1 failed.
    at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:528)
    at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:167)
    at com.vaadin.server.AbstractClientConnector.fireEvent(AbstractClientConnector.java:969)
    at com.vaadin.ui.Button.fireClick(Button.java:368)
    at com.vaadin.ui.Button$1.click(Button.java:57)
    ... 29 more
Caused by: java.lang.NullPointerException
    at com.example.myapp.web.view.ExampleMainTableContainer.addItemsToContainer(ExampleMainTableContainer.java:94)
    at com.example.myapp.web.view.ExampleMainTable.addMainTableItems(ExampleMainTable.java:172)
    at com.example.myapp.web.view.ExampleMainTable.experiment(ExampleMainTable.java:86)
    at com.example.myapp.web.view.ExampleView$1.buttonClick(ExampleView.java:208)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:508)
    ... 33 more

person Roger    schedule 30.09.2013    source источник
comment
В какой именно строке появляется NPE?   -  person Daniel S.    schedule 30.09.2013
comment
Ой, извини. Он выбрасывается, когда я пытаюсь установить значение. Пожалуйста, смотрите мой обновленный оригинальный пост. ПРИМЕЧАНИЕ. NPE вызывается во второй раз, когда вызывается метод addItemsToContainer, а не в первый.   -  person Roger    schedule 30.09.2013
comment
Пожалуйста, разложите строку, где выбрасывается NPE, насколько это возможно, используя локальные переменные и выполняя одно действие за раз. Это означает, что выполните IndexedContainer c = getContainerProperty(...); Объект personId = person.getId(); c.setValue (идентификатор человека); все на разных линиях. затем посмотрите, какая часть вызывает NPE.   -  person Daniel S.    schedule 30.09.2013
comment
Да я уже сделал. В своем исходном посте я утверждаю, что это происходит в методе setValue(), который является методом интерфейса свойств Vaadin. Я не могу отлаживать больше, чем это - как только я получаю значение от person.getId(), выбрасывается NPE.   -  person Roger    schedule 30.09.2013
comment
Пожалуйста, выложите здесь полную трассировку стека. Кроме того, имея дело с NPE, вам нужно точно указать, какой из этих объектов является нулевым. Является ли контейнер собственностью или человеком?   -  person default locale    schedule 01.10.2013
comment
Я согласен с локалью по умолчанию: опубликуйте полную трассировку стека.   -  person Daniel S.    schedule 01.10.2013
comment
Пожалуйста, смотрите мой обновленный OP, где я разместил трассировку стека.   -  person Roger    schedule 01.10.2013
comment
Извините за повторный вопрос. Вы уверены, что getContainerProperty(itemId, "Id") не возвращает null? Вы можете проверить это?   -  person default locale    schedule 01.10.2013
comment
@Daniel S. @язык по умолчанию Вы, ребята, были правы. getContainerProperty(...) вернул null. Я копнул немного глубже и нашел это: if (isFiltered()) { return getFilteredItemIds(); } else { return getAllItemIds();} ... что означает, что он возвращает пустой список --› в конечном итоге приводит к тому, что метод getContainerProperty(...) возвращает значение null, потому что я действительно фильтровал элементы в контейнере до этого. Большое спасибо за ваш вклад и помощь, это помогло мне найти причину проблемы!   -  person Roger    schedule 01.10.2013


Ответы (1)


Метод getContainerProperty(...) вернул null, что привело к NPE.

Это произошло потому, что я отфильтровал свой контейнер перед вторым вызовом addItemsToContainer(...).

Когда я добавляю новый элемент в свой контейнер, он добавляется в allItemIdsfilteredItemIds остается пустым. Теперь, когда вызывается getContainerProperty(...), он проверяет, был ли контейнер отфильтрован. Если он был отфильтрован, он возвращает filteredItemIds вместо allItemIds. Это означало, конечно, что этот оператор вернул пустой список объектов, что привело к тому, что «getContainerProperty(...)» вернуло null, что в конечном итоге привело к NPE.

Решение состояло в том, чтобы просто добавить removeAllContainerFilters(); перед моими вызовами 'getContainerProperty(...)'.

person Roger    schedule 01.10.2013