Как исправить исключение Null-Pointer с помощью автоматически сгенерированного кода RapidClipse
С RapidClipse я создаю страницу из трех элементов.
Выпадающее поле, XdevTable и XDevfieldGroup.
Раскрывающееся поле заполняется содержимым таблицы базы данных (работает нормально)
Таблица должна быть заполнена после выбора значения из выпадающего поля (работает нормально)
После выбора значения из XDevTable соответствующая строка должна быть редактируемой группой полей.
После выбора строки в таблице я получаю исключение с нулевым указателем:
Mai 27, 2019 4:41:19 PM com.vaadin.server.DefaultErrorHandler doDefault
SCHWERWIEGEND:
java.lang.NullPointerException
at
com.xdev.ui.entitycomponent.table.AbstractBeanTable.getSelectedItem(AbstractBeanTable.java:180)
at com.xdev.ui.masterdetail.FieldGroupMasterDetailConnection.lambda$0(FieldGroupMasterDetailConnection.java:64)
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.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:510)
at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:200)
at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:163)
at com.vaadin.server.AbstractClientConnector.fireEvent(AbstractClientConnector.java:1015)
at com.vaadin.ui.AbstractField.fireValueChange(AbstractField.java:1161)
at com.vaadin.ui.AbstractField.setValue(AbstractField.java:571)
at com.vaadin.ui.AbstractSelect.setValue(AbstractSelect.java:735)
at com.vaadin.ui.AbstractField.setValue(AbstractField.java:468)
at com.vaadin.ui.AbstractSelect.changeVariables(AbstractSelect.java:547)
at com.vaadin.ui.Table.changeVariables(Table.java:2933)
at com.vaadin.server.communication.ServerRpcHandler.changeVariables(ServerRpcHandler.java:616)
at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:463)
at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:406)
at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:273)
at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:90)
at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1435)
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:380)
at com.xdev.communication.XdevServlet.service(XdevServlet.java:212)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:660)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:798)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:808)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
Если я прав, я предполагаю, что есть утечка, идентифицирующая предмет, который выбран в таблице.
Но я все еще делал то, что / как описано в RapidClipse Training.
Таким образом, связь между таблицей и группой полей осуществляется с помощью свойства "ConnectedForm" внутри таблицы.
Подключение из раскрывающегося поля к таблице осуществляется с помощью следующего кода:
private void comboBox_valueChange(final Property.ValueChangeEvent event) {
try {
Integer varMainClass = 0;
varMainClass = this.comboBox.getSelectedItem().getBean().getId();
Notification.show("Kuck a mole: ", this.comboBox.getSelectedItem().getBean().getGroupName()
, Notification.Type.ERROR_MESSAGE);
final BeanItemContainer<TGroup> mySubClasses = new BeanItemContainer<>(TGroup.class);
mySubClasses.addAll(new TGroupDAO().getAllSubClassByMainClassId(varMainClass));
this.table.setContainerDataSource(mySubClasses);
this.table.setVisibleColumns("id", "groupName");
this.table.setVisible(true);
} catch (final Exception e) {
e.printStackTrace();
final String stackTrace = Throwables.getStackTraceAsString(e);
this.textAreaErr.setValue(stackTrace);
this.textAreaErr.setVisible(true);
Notification.show("Do isch was falsch, Nachricht: ", e.getMessage(), Notification.Type.ERROR_MESSAGE);
}
}
В таблице событие valueChange является просто уведомлением для целей тестирования:
private void table_valueChange(final Property.ValueChangeEvent event) {
Notification.show("Kuck a mole: ", this.table.getSelectedItem().getBean().getGroupName()
, Notification.Type.ERROR_MESSAGE);
}
All help would be appreciated
Thanks in advance
1 ответ
Я счастлив, потому что я нашел решение с помощью моего друга!
Это все еще была моя ошибка (как и ожидалось:-)). Я использовал неправильный тип контейнера:
Я использовал:
final BeanItemContainer<TGroup> mySubClasses = new BeanItemContainer<>(TGroup.class);
Но это был не тот контейнер!
Я должен использовать вместо этого:
final XdevBeanItemContainer<TGroup> mySubClasses = new XdevBeanItemContainer<>(TGroup.class);
После того, как я изменил его, все работало нормально.
Я также искал в документации подсказку, как можно предотвратить это в будущем, но безуспешно.