Добрый день.
Некоторое время назад я обзавелся задачей реализовать бин, который будет работать на web слое и производить те или иные действия с веб компонентами.
Конкретно я решил сделать бин-билдер, который будет строить диалоговое окно с нужными мне параметрами.
Я создал класс, реализовал в нем нужный функционал.
Класс
package com.company.itam.web.utils;
import com.company.itam.web.screens.DetailDialog;
import com.haulmont.cuba.gui.ScreenBuilders;
import com.haulmont.cuba.gui.screen.FrameOwner;
import com.haulmont.cuba.gui.screen.OpenMode;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import javax.inject.Inject;
@Component("itam_DialogBuilder")
public class DialogBuilderExt {
@Inject
private ScreenBuilders screenBuilders;
/**
* Метод возвращает диалоговое окно.
*
* @param frameOwner - Фрейм, в котором необходимо открыть диалоговое окно.
* @param caption - Тема диалогового окна.
* @param message - Содержание диалогового окна.
* @return - Диалоговое окно.
*/
@SuppressWarnings("unchecked")
public DetailDialog createDetailDialog(FrameOwner frameOwner, String caption, String message) {
DetailDialog detailDialog = screenBuilders.screen(frameOwner)
.withScreenClass(DetailDialog.class)
.withLaunchMode(OpenMode.DIALOG)
.build();
detailDialog.getDialogCaption().setValue(caption);
detailDialog.getMessageText().setValue(message);
return detailDialog;
}
}
Указал, что это @Component , как описано здесь.
После запуска приложения бин работает прекрасно, но как только я делаю HotDeploy, экраны, где инжектиться этот бин, перестают открываться, и я получаю исключение.
Исключение
Caused by: java.lang.reflect.InvocationTargetException: null
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_261]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_261]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_261]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_261]
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:153) ~[vaadin-server-8.9.2-13-cuba.jar:8.9.2-13-cuba]
... 38 common frames omitted
Caused by: com.haulmont.cuba.core.global.DevelopmentException: Unable to find an instance of type 'class com.company.itam.web.utils.DialogBuilderExt' named 'dialogBuilderExt' declared in 'com.company.itam.web.screens.MasterDetailScreenBase' for instance of 'com.company.itam.web.screens.portfolio.PortfolioBrowse'
at com.haulmont.cuba.gui.sys.UiControllerDependencyInjector.doInjection(UiControllerDependencyInjector.java:535) ~[cuba-gui-7.2.6.jar:7.2.6]
at com.haulmont.cuba.gui.sys.UiControllerDependencyInjector.injectValues(UiControllerDependencyInjector.java:274) ~[cuba-gui-7.2.6.jar:7.2.6]
at com.haulmont.cuba.gui.sys.UiControllerDependencyInjector.inject(UiControllerDependencyInjector.java:112) ~[cuba-gui-7.2.6.jar:7.2.6]
at com.haulmont.cuba.web.sys.WebScreens.createScreen(WebScreens.java:242) ~[cuba-web-7.2.6.jar:7.2.6]
at com.haulmont.cuba.web.sys.WebScreens.create(WebScreens.java:175) ~[cuba-web-7.2.6.jar:7.2.6]
at com.haulmont.cuba.gui.config.MenuItemCommands$ScreenCommand.run(MenuItemCommands.java:319) ~[cuba-gui-7.2.6.jar:7.2.6]
at com.haulmont.cuba.web.sys.SideMenuBuilder$MenuCommandExecutor.accept(SideMenuBuilder.java:264) ~[cuba-web-7.2.6.jar:7.2.6]
at com.haulmont.cuba.web.sys.SideMenuBuilder$MenuCommandExecutor.accept(SideMenuBuilder.java:249) ~[cuba-web-7.2.6.jar:7.2.6]
at com.haulmont.cuba.web.gui.components.mainwindow.WebSideMenu$MenuItemImpl.menuSelected(WebSideMenu.java:576) ~[cuba-web-7.2.6.jar:7.2.6]
at com.haulmont.cuba.web.widgets.CubaSideMenu$1.menuItemTriggered(CubaSideMenu.java:90) ~[cuba-web-widgets-7.2.6.jar:na]
... 43 common frames omitted
Подскажите, в чем проблема, я как-то неправильно создал бин, или это баги HotDeploy?
С другими мною созданными бинами на этом уровне проблема аналогична.