IllegalStateException в условном наблюдателе в компоненте Vaadin @RouteScoped

Мы используем Vaadin 23 (23.0.9) с vaadin-cdi (14.0.0) и имеем проблемы с условными наблюдателями в компонентах @RouteScoped (как это описано в руководстве):

      @RouteScoped
public class ScopedComponent extends Div {
    private void onMessage(
            @Observes(notifyObserver = IF_EXISTS)
            MessageEvent message) {
        setText(message.getText());
    }
}

Мы работаем на Tomcat 9 и используем Weld (3.1.9.Final) в качестве нашей реализации CDI. Наша текущая проблема заключается в том, что мы получаем следующее исключение при запуске события, наблюдаемого в компоненте @RouteScoped:

java.lang.IllegalStateException: экземпляр класса XXX владельца маршрута недоступен в цепочке активных компонентов навигации: область, определенная bean-компонентом 'YYY', не существует.

Мы считаем, что проблема заключается в изменениях, реализованных в Vaadin CDI 13.0.0 (https://github.com/vaadin/cdi/releases/tag/13.0.0):

Попытка использовать @RouteScope при отсутствии активного компонента маршрута не допускается.

В используемой нами реализации Weld метод getReceiverIfExists вызывает метод getContextualStorage() в классе RouteScopedContext. И getReceiverIfExists вызывается до того, как будет рассмотрен прием наблюдателя. Поэтому все классы, у которых есть наблюдатель за событием, пытаются быть получены, и поскольку не все классы @RouteScoped находятся в текущей цепочке навигации, возникает вышеупомянутая ошибка.

      Object receiver = getReceiverIfExists(null); //this is where the exception is thrown
if (receiver == null && reception != Reception.IF_EXISTS) {
   // creational context is created only if we need it for obtaining receiver
   // ObserverInvocationStrategy takes care of creating CC for parameters, if needed
   creationalContext = beanManager.createCreationalContext(declaringBean);
   receiver = getReceiverIfExists(creationalContext);
}
if (receiver != null) {
   sendEvent(event, receiver, creationalContext);
}

Мы не совсем уверены, что мы делаем неправильно или что мы могли бы сделать по-другому. Используем ли мы правильные версии vaadin-cdi и Weld?

1 ответ

В настоящее время это ошибка в vaadin-cdi (версия 14.0.0): https://github.com/vaadin/cdi/issues/390 .

Исправление уже объединено: https://github.com/vaadin/cdi/pull/393 .

Другие вопросы по тегам