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 .