代码之家  ›  专栏  ›  技术社区  ›  Gauvain Klug

带有Viritin ListDataProvider的网格随机失败

  •  0
  • Gauvain Klug  · 技术社区  · 6 年前

    我正在开发一个Vaadin流(10.0.5)应用程序,里面有几个网格。所有这些都使用来自Viritin的ListDataProvider。

    当我在网格中滚动时,有时它会生成一个NPE:

    java.lang.NullPointerException
    at sun.reflect.GeneratedMethodAccessor403.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.__invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.vaadin.flow.data.binder.BeanPropertySet.invokeWrapExceptions(BeanPropertySet.java:516)
    at com.vaadin.flow.data.binder.BeanPropertySet.access$600(BeanPropertySet.java:48)
    at com.vaadin.flow.data.binder.BeanPropertySet$NestedBeanPropertyDefinition.lambda$getGetter$3ec26976$1(BeanPropertySet.java:200)
    at com.vaadin.flow.component.grid.Grid.runPropertyValueGetter(Grid.java:1137)
    at com.vaadin.flow.component.grid.Grid.lambda$addColumn$cb98939f$1(Grid.java:1119)
    at com.vaadin.flow.component.grid.Grid.lambda$addColumn$c3690ee2$1(Grid.java:923)
    at com.vaadin.flow.data.renderer.Renderer$TemplateRendering.lambda$null$2db14883$1(Renderer.java:261)
    at com.vaadin.flow.data.provider.CompositeDataGenerator.lambda$generateData$0(CompositeDataGenerator.java:47)
    at java.lang.Iterable.forEach(Unknown Source)
    at com.vaadin.flow.data.provider.CompositeDataGenerator.generateData(CompositeDataGenerator.java:47)
    at com.vaadin.flow.data.provider.CompositeDataGenerator.lambda$generateData$0(CompositeDataGenerator.java:47)
    at java.lang.Iterable.forEach(Unknown Source)
    at com.vaadin.flow.data.provider.CompositeDataGenerator.generateData(CompositeDataGenerator.java:47)
    at com.vaadin.flow.data.provider.DataCommunicator.generateJson(DataCommunicator.java:627)
    at java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
    at java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
    at java.util.stream.IntPipeline$4$1.accept(Unknown Source)
    at java.util.stream.Streams$RangeIntSpliterator.forEachRemaining(Unknown Source)
    at java.util.Spliterator$OfInt.forEachRemaining(Unknown Source)
    at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source)
    at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
    at java.util.stream.ReferencePipeline.collect(Unknown Source)
    at com.vaadin.flow.data.provider.DataCommunicator.getJsonItems(DataCommunicator.java:587)
    at com.vaadin.flow.data.provider.DataCommunicator.lambda$collectChangesToSend$2(DataCommunicator.java:550)
    at com.vaadin.flow.data.provider.DataCommunicator.applyIfNotEmpty(DataCommunicator.java:601)
    at com.vaadin.flow.data.provider.DataCommunicator.withMissing(DataCommunicator.java:595)
    at com.vaadin.flow.data.provider.DataCommunicator.collectChangesToSend(DataCommunicator.java:549)
    at com.vaadin.flow.data.provider.DataCommunicator.flush(DataCommunicator.java:452)
    at com.vaadin.flow.data.provider.DataCommunicator.lambda$requestFlush$2f364bb9$1(DataCommunicator.java:409)
    at com.vaadin.flow.internal.StateTree.lambda$runExecutionsBeforeClientResponse$1(StateTree.java:350)
    at java.util.ArrayList.forEach(Unknown Source)
    at com.vaadin.flow.internal.StateTree.runExecutionsBeforeClientResponse(StateTree.java:347)
    at com.vaadin.flow.server.communication.UidlWriter.encodeChanges(UidlWriter.java:334)
    at com.vaadin.flow.server.communication.UidlWriter.createUidl(UidlWriter.java:179)
    at com.vaadin.flow.server.communication.UidlRequestHandler.writeUidl(UidlRequestHandler.java:119)
    at com.vaadin.flow.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:91)
    at com.vaadin.flow.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40)
    at com.vaadin.flow.server.VaadinService.handleRequest(VaadinService.java:1486)
    at com.vaadin.flow.server.VaadinServlet.service(VaadinServlet.java:300)
    

    但是其他包含更多列和更多数据的网格(对于我的一个例子,超过2000个)绝对没有例外。 我已经检查了NPE发生时从提供程序加载的最后一个数据库对象的id(将grid page设置为1以确保它是最后一个),它从来都不相同,而且对于网格中的其他对象也没有什么特别之处。

    我在填充网格设置列主要是通过实体的propId,一些是生成的列,比如其他两列的总和。

    你知道是什么导致了这些随机的异常吗?

    提前谢谢!

    1 回复  |  直到 6 年前
        1
  •  0
  •   Gauvain Klug    6 年前

    重写后 Grid 把记录器放进 runPropertyValueGetter ,似乎NPE是由 null

    随机效果是由网格渲染的延迟引起的,有时在渲染错误行之前它失败了。

    推荐文章