No DataContext found in editor

I got a strange exception. When I try to open editor for entity I get the exception:

com.haulmont.cuba.core.global.DevelopmentException: No DataContext found in editor: 'enerstroymain$TransferAct.edit'
	at com.haulmont.cuba.gui.builders.EditorBuilderProcessor.setupParentDataContext(EditorBuilderProcessor.java:334)
	at com.haulmont.cuba.gui.builders.EditorBuilderProcessor.buildEditor(EditorBuilderProcessor.java:94)
	at com.haulmont.cuba.gui.builders.EditorBuilder.build(EditorBuilder.java:359)
	at com.company.enerstroymain.web.screens.actregistry.ActRegistryEdit.editAct(ActRegistryEdit.java:27)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at com.haulmont.cuba.gui.xml.DeclarativeAction.actionPerform(DeclarativeAction.java:101)
	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 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	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.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	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.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:200)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:836)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1747)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Unknown Source)

For the opening of editor I use a standard action edit as I use it in other places but with other places everything ok. My cod is:

        <table id="actsTable" dataContainer="actsDc" width="100%" height="200px">
            <actions>
                <action id="create" type="create"/>
                <action id="edit" type="edit"/>
                <action id="remove" type="remove"/>
            </actions>
            <columns>
                <column id="num"/>
                <column id="meter"/>
                <column id="actStatus"/>
                <column id="street"/>
                <column id="house"/>
                <column id="structure"/>
                <column id="appartament"/>
                <column id="fio"/>
                <column id="lsNum"/>
                <column id="actDate"/>
                <column id="exPuNum"/>
            </columns>
            <buttonsPanel>
                <button action="actsTable.create"/>
                <button action="actsTable.edit"/>
                <button action="actsTable.remove"/>
            </buttonsPanel>
        </table>

Also, I tried to use a method in the controller and get the same exception. My method was:

     public void editAct(){
        Screen screen = screenBuilders
                .editor(actsTable)
                .editEntity(actsTable.getSingleSelected())
                .withLaunchMode(OpenMode.NEW_WINDOW)
                .build()
                .show();
    }

More info. The screen which I try to open extends AbstractEditor. The screen where the button exists extends StandardEditor.

Thank you for help.

When I get Entity as property like this:

    <data>
        <instance id="actRegistryDc"
                  class="com.company.enerstroymain.entity.tuact.ActRegistry"
                  view="actRegistry-full-view">
            <loader/>
            <collection id="actsDc" property="acts"/>
        </instance>

I got the exception, but when I changed the method to get an entity it works well.

        <collection id="actsDc" class="com.company.enerstroymain.entity.tuact.TransferAct"
                    view="_local">
            <loader id="transferActsDl">
                <query><![CDATA[select e from enerstroymain$TransferAct e
where e.actRegistry = :actRefistryId]]></query>   </loader>
        </collection>

The problem is when you open an editor for TransferAct entity loaded in a nested data container (1st case), the framework tries to edit it as a composition, i.e. to commit into the parent editor screen. But it’s impossible if the parent screen uses modern API (extends StandardEditor) and the child editor is a legacy screen (extends AbstractEditor).
That’s why your second case works - it doesn’t use composition mode.

Regards,
Konstantin

1 Like