Vaadin UI.access() вызывает исключение ExecutionException

#java #session #exception #vaadin #vaadin7

#java #сеанс #исключение #vaadin #vaadin7

Вопрос:

Я вижу это исключение в проекте Vaadin. Однако функциональность на самом деле не нарушается. Код в run() методе выполняет то, что он предназначен для завершения, но появляется это исключение.

 E 140619 124701.131 [Thread-2] MainUI - Uncaught throwable: 
java.util.concurrent.ExecutionException: java.lang.NullPointerException
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:188)
    at com.vaadin.server.VaadinSession$FutureAccess.get(VaadinSession.java:123)
    at com.vaadin.server.VaadinService.runPendingAccessTasks(VaadinService.java:1802)
    at com.vaadin.server.VaadinSession.unlock(VaadinSession.java:1012)
    at com.vaadin.server.VaadinService.ensureAccessQueuePurged(VaadinService.java:1763)
    at com.vaadin.server.VaadinService.accessSession(VaadinService.java:1729)
    at com.vaadin.server.VaadinSession.access(VaadinSession.java:1402)
    at com.vaadin.ui.UI.access(UI.java:1372)
 

происходит здесь

 ui.acccess(new Runnable() {
    @Override
    public void run() {
        //code here
    }
} 
 

Что я должен делать? Могу ли я просто перехватить исключение и проигнорировать его или где-то есть ошибка в моем коде?

Он использует аннотацию @Push для расширения пользовательского интерфейса MainUI и содержит код, подобный:

 @Override
protected void init(VaadinRequest request) {
    WrappedSession wrappedSession = request.getWrappedSession();
    final String id = wrappedSession.getId();
    log.info("Created new UI for session id {}", id);

    VaadinSession.getCurrent().setErrorHandler(new DefaultErrorHandler() {
        @Override
        public void error(com.vaadin.server.ErrorEvent event) {
            super.error(event);
            log.error("Uncaught throwable: ", event.getThrowable());
        }
    });

    ...
}
 

Еще один пример

[Этот раздел добавлен другим автором]

Я, Бэзил Бурк, получаю то, что кажется таким же исключением при том же использовании. Исключение генерируется при использовании в производстве (не в разработке).

Использование Vaadin 7.1.3 с помощью Push с Tomcat 8.0.12 на Java 8 Обновление 20 на Mac OS X Mountain Lion.

Исключение:

 Nov 04, 2014 4:45:50 AM com.vaadin.server.DefaultErrorHandler doDefault
SEVERE: 
java.util.concurrent.ExecutionException: java.lang.NullPointerException
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:192)
    at com.vaadin.server.VaadinSession$FutureAccess.get(VaadinSession.java:123)
    at com.vaadin.server.VaadinService.runPendingAccessTasks(VaadinService.java:1800)
    at com.vaadin.server.VaadinSession.unlock(VaadinSession.java:1013)
    at com.vaadin.server.VaadinService.ensureAccessQueuePurged(VaadinService.java:1761)
    at com.vaadin.server.VaadinService.accessSession(VaadinService.java:1727)
    at com.vaadin.server.VaadinSession.access(VaadinSession.java:1403)
    at com.vaadin.ui.UI.access(UI.java:1389)
    at com.rainwatersoft.powerwrangler.curr_sup_dem.CurrSupDemReportUpdater.update(CurrSupDemReportUpdater.java:164)
    at com.rainwatersoft.powerwrangler.curr_sup_dem.CurrSupDemReportUpdater.checkForUpdate(CurrSupDemReportUpdater.java:125)
    at com.rainwatersoft.powerwrangler.curr_sup_dem.CurrSupDemReportUpdater.lambda$considerUpdate$2(CurrSupDemReportUpdater.java:110)
    at com.rainwatersoft.powerwrangler.curr_sup_dem.CurrSupDemReportUpdater$Lambda$3/1011224121.run(Unknown Source)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
 

Код-нарушитель использует синтаксис лямбда Java 8 для передачи Runnable в метод UI::access.

 layout.getUI().access( () -> { // Runnable
    layout.freshen( this.interval );
} );
 

Комментарии:

1. Я нахожу странным, что в управлении сеансами есть NPE. Используете ли вы какой-либо серверный push?

2. Что вы подразумеваете под нажатием сервера?

3. vaadin.com/book/vaadin7/-/page/advanced.push.html

4. ДА, @Push public class MainUI extends UI {

5. Используете ли вы vaadin 7.2.0? В области push было много исправлений

Ответ №1:

Вот выдержка из моего кода:

 // remember UI and request attributes
val ui = UI.getCurrent
val attributes = RequestContextHolder.getRequestAttributes

future.onSuccess {
  case e => ui.access(
    new Runnable {
      override def run(): Unit = {
        try {
          RequestContextHolder.setRequestAttributes(attributes)
          success.apply(e)
        } finally {
          RequestContextHolder.resetRequestAttributes()
        }
      }
    }
  )
}

future.onFailure {
  case t => ui.access(
    new Runnable {
      override def run(): Unit = {
        try {
          _logger.error("Something goes wrong in async await request", t)
          RequestContextHolder.setRequestAttributes(attributes)
          failure.apply(t)
        } finally {
          RequestContextHolder.resetRequestAttributes()
        }
      }
    }
  )
}
 

Я использую spring4vaadin с последней версией Vaadin 7.2.x.

Ответ №2:

Я бы рекомендовал запустить приложение в jvm с параметром -ea, чтобы включить утверждения. Обычно это исключение выдается из-за неправильного кода в другом месте. Т.е. Ваш ui.access(..), скорее всего, правильный, но какой-то другой фрагмент кода фактически блокирует пользовательский интерфейс и, следовательно, генерируется исключение.