Добрый день.
Подскажите, пожалуйста, есть ли возможность (может через unwrap
) добавить произвольную кнопку, например для создания нового элемента?
Добрый день.
Подскажите, пожалуйста, есть ли возможность (может через unwrap
) добавить произвольную кнопку, например для создания нового элемента?
Добрый день.
Для достижения поставленной цели, могу посоветовать следующее:
public class CustomTokenList<V extends Entity> extends WebTokenList<V> {
public CustomTokenList() {
component = new CustomCubaTokenList<>(this);
}
public void addButton(Button button) {
((CustomCubaTokenList<?>) component)
.addComponent(button.unwrap(Component.class));
}
}
public class CustomCubaTokenList<T extends Entity> extends CubaTokenList<T> {
public CustomCubaTokenList(WebTokenList<T> owner) {
super(owner);
}
public void addComponent(Component component) {
editor.addComponent(component);
}
}
components.xml
:<components xmlns="http://schemas.haulmont.com/cuba/components.xsd">
<component>
<name>tokenList</name>
<class>com.company.demo.web.components.CustomTokenList</class>
</component>
</components>
web-app.properties
:cuba.web.componentsConfig = +com/company/demo/components.xml
@Inject
private CustomTokenList<Person> tokenList;
@Inject
private Notifications notifications;
@Inject
private UiComponents uiComponents;
@Subscribe
public void onInit(InitEvent event) {
Button button = uiComponents.create(Button.NAME);
button.setCaption("Button");
button.addClickListener(clickEvent ->
notifications.create()
.withCaption("Button is clicked")
.show());
tokenList.addButton(button);
}
Demo: custom-tokenlist.zip (83.8 КБ)
Глеб
Глеб, может подскажите что.
Вынес CustomTokenList в отдельный проект. Собрал артефакт. Подключил.
На отладке все работает, а вот развернутое в war - нет.
Первое, что приходит в голову, что среды выполнения отличаются (т.е. версия java). И это я проверил.
IllegalArgumentException: Can not set com.borets.cuic.web.components.tokenlist.CustomTokenList field com.borets.hps.web.screens.project.ProjectEdit.parametersField to com.haulmont.cuba.web.gui.components.WebTokenList
java.lang.IllegalArgumentException: Can not set com.borets.cuic.web.components.tokenlist.CustomTokenList field com.borets.hps.web.screens.project.ProjectEdit.parametersField to com.haulmont.cuba.web.gui.components.WebTokenList
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at java.base/jdk.internal.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81)
at java.base/java.lang.reflect.Field.set(Field.java:780)
at com.haulmont.cuba.gui.sys.UiControllerDependencyInjector.assignValue(UiControllerDependencyInjector.java:746)
at com.haulmont.cuba.gui.sys.UiControllerDependencyInjector.doInjection(UiControllerDependencyInjector.java:498)
at com.haulmont.cuba.gui.sys.UiControllerDependencyInjector.injectValues(UiControllerDependencyInjector.java:272)
at com.haulmont.cuba.gui.sys.UiControllerDependencyInjector.inject(UiControllerDependencyInjector.java:112)
at com.haulmont.cuba.web.sys.WebScreens.createScreen(WebScreens.java:241)
at com.haulmont.cuba.web.sys.WebScreens.create(WebScreens.java:175)
at com.haulmont.cuba.gui.builders.EditorBuilderProcessor.createScreen(EditorBuilderProcessor.java:287)
at com.haulmont.cuba.gui.builders.EditorBuilderProcessor.buildEditor(EditorBuilderProcessor.java:89)
at com.haulmont.cuba.gui.builders.EditorBuilder.build(EditorBuilder.java:359)
at com.haulmont.cuba.gui.actions.list.CreateAction.actionPerform(CreateAction.java:110)
at com.haulmont.cuba.web.gui.components.WebButton.buttonClicked(WebButton.java:64)
at com.haulmont.cuba.web.widgets.CubaButton.fireClick(CubaButton.java:76)
at com.vaadin.ui.Button$1.click(Button.java:57)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:153)
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:115)
at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:431)
at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:396)
at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:260)
at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:82)
at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40)
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1577)
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:425)
at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:329)
at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:215)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:107)
at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:73)
at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:93)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
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 com.haulmont.cuba.web.sys.singleapp.SingleAppWebContextLoader$SetClassLoaderFilter.doFilter(SingleAppWebContextLoader.java:244)
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.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:834)
Добавил в основной проект соответствующее свойство (повторил):
cuba.web.componentsConfig = +com/company/demo/components.xml
Все работает.
Вопрос: как бы обойтись без дублирования данного свойства. Может в single-war-web.xml
что-то добавить будет правильнее?
Добрый день.
У меня не получилось воспроизвести проблему. war успешно запустился и открыл экран с подключенным компонентом. Все настройки дефолтные. Демо проект помог бы найти причину.
Глеб