Инспектор сущностей unfetched attribute access error

Добрый день!
Подскажите, пожалуйста, какие представления используются для инспектора сущностей?

Пытаюсь открыть сущность через инспектор, получаю ошибку.
2022-10-17_161832

Добрый!
Какая у вас версия платформы? Исходный код класса с сущностью можете привести?

Спасибо большое за ответ, вопрос очень актуальный.

Версия 7.2.17
Сущность в приложенном архиве вместе с зависимостями.
Ошибка происходит при открытии сущности ServiceOrder, если есть записи ServiceOrderItem. Если нет записей, то окно на редактированиe открывается без ошибок.
Если ошибка появилась, то пропадают кнопки “Ок” и “Отмена” на экране редактирования и при попытке закрыть экран появляется ошибка IllegalStateException: Screen is not opened entityInspector.browse

java.lang.IllegalStateException: Screen is not opened entityInspector.browse
at com.haulmont.cuba.web.sys.WebScreens.checkOpened(WebScreens.java:591)
at com.haulmont.cuba.web.sys.WebScreens.remove(WebScreens.java:661)
at com.haulmont.cuba.gui.screen.Screen.close(Screen.java:340)
at com.haulmont.cuba.web.sys.WebScreens$TabCloseTask.run(WebScreens.java:1880)
at com.haulmont.cuba.web.sys.WebScreens.handleTabWindowClose(WebScreens.java:1859)
at com.haulmont.cuba.web.widgets.CubaMainTabSheet.lambda$new$f77d23a5$1(CubaMainTabSheet.java:126)
at com.vaadin.ui.TabSheet$TabsheetServerRpcImpl.closeTab(TabSheet.java:100)
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:442)
at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:407)
at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:275)
at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:83)
at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40)
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1636)
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:465)
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:733)
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:108)
at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
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:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
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:829)

entity.7z (13.1 КБ)
2022-10-21_101619
2022-10-19_130857
2022-10-21_101955

Здравствуйте!
Не используете ли вы BeforeDetachEntityListener сущности ServiceOrder с какой-нибудь логикой, которая может вызывать unfetched attribute access error?

Здравствуйте!
Не использую.

В коде сущностей сходу ничего криминального не видно. Соберите, пожалуйста, нужные сущности в проект, и приложите зипник с этим проектом сюда. Также опишите последовательность шагов, которую нужно выполнить в этом проекте для воспроизведения ошибки. В этом случае мы быстрее сможем понять в чём проблема.

Прикладываю проект и дамп базы данных, пароль в приложение стандартный.
Нужно в инспекторе сущностей выбрать сущность ServiceOrder, там одна сущность, нажать “Edit”, тогда появится ошибка.

Заранее спасибо за любой ответ, очень ждем!

entinspdb_221025.7z (22.6 КБ)
entity_inspector.zip (172.2 КБ)

2022-10-25_113013
2022-10-25_113054
2022-10-25_113118

Если metaProperty у вас вычисляется в геттере, то нет необходимости в сущности делать отдельно поле и отдельно геттер. Достаточно сделать только геттер и на него повесить аннотацию @MetaProperty.

Т.е. в ServiceOrderItem вот это убрать:

    @Transient
    @MetaProperty
    protected BigDecimal employee12WCostPlan;

На метод аннотацию добавить:

    @MetaProperty(related = "workProcess")
    public BigDecimal getEmployee12WCostPlan() {
    // ...
    }

Обрабратите внимание на атрибут related у аннотации. Он необходим, если ваше мета-проперти зависит от других атрибутов, и если загрузка других атрибутов требуется для вычисления данного мета-проперти.

Про это есть немного в документации.

Спасибо большое!
Ошибка в ServiceOrder ушла.
Подскажите, пожалуйста, по аналогичной ошибке в ServiceOrderItemDetail - как добавить в представление для инспектора атрибут, ссылки на котором нет в самой сущности, а он есть во вложенной сущности.
Подскажите, пожалуйста, как добавить workProcess?

@MetaProperty(related = “serviceOrderItem”)
public BigDecimal getSallaryPlan() {
if (serviceOrderItem == null || serviceOrderItem.getWorkProcess() == null) {
return new BigDecimal(0);
}
Double employeeCost = serviceOrderItem.getWorkProcess().getEmployeeCost();
BigDecimal employeeCostBD = new BigDecimal(employeeCost == null ? 0 : employeeCost).setScale(2, BigDecimal.ROUND_HALF_UP);
BigDecimal quantityFactBD = new BigDecimal(quantityFact == null ? 0 : quantityFact).setScale(3, BigDecimal.ROUND_HALF_UP);
return employeeCostBD.multiply(quantityFactBD);
}

Прикладываю новый проект и новую базу с ошибкой.
entinspdb_221025_1.7z (22.8 КБ)
entity_inspector1.zip (310.2 КБ)
2022-10-25_180450

Вы можете добавить нужный атрибут в виде serviceOrderItem.workProcess:

@MetaProperty(related = {"serviceOrderItem", "serviceOrderItem.workProcess"})
public BigDecimal getSallaryPlan() {
   //...
}

У вас ещё невалидный @NamePattern в классе ContractHistoryWorkProcess. Чтобы пример заработал нужно его поправить либо закомментировать.

Удалила @NamePattern, добавила “serviceOrderItem.workProcess”, на экране инспектора объектов при выборе типа сущности ServiceOrderItemDetail получаю ошибку.
IllegalArgumentException: Property ‘serviceOrderItem.workProcess’ not found in wld_ServiceOrderItemDetail

Можете приложить пример работающего проекта?
2022-10-28_093443

Да, прошу прощения, скорее всего я открыл экран какой-то другой сущности и поэтому подумал, что подобный подход заработал. Похоже, через точку вложенные проперти указать не получится. Да и загрузить related сущность с определённой вью тоже вряд ли получится в методе с @MetaProperty.

А вам обязательно нужно, чтобы вычисление SallaryPlan было именно внутри кода сущности и именно через MetaProperty? Боюсь, что в EntityInspector подобная сущность так просто не отобразится. Сходу приходят в голову следующие варианты решения проблемы:

  1. Делегировать вычисление отдельному spring-бину. Например у вас будет ServiceOrderItemDetailUtils.calculateSalaryPlan(ServiceOrderItemDetail itemDetail). Когда вам нужно будет вычислить значение свойства, вы будете вызывать этот сервис, передавая аргументом нужный ServiceOrderItemDetail. Из сущности соответственно этот метод вы уберёте. В entity inspector вы это значение не увидите при подобном подходе.
  2. Хранить значение salaryPlan в персистентном атрибуте сущности в базе и, например, с помощью механизмов EntityChangedEvent отслеживать изменения всех атрибутов, от которых зависит salaryPlan, и в случае изменения этих атрибутов обновлять в базе значение ServiceOrderItemDetail.salaryPlan.
  3. Попробовать на уровне вашего проекте переопределить экран entity inspector таким образом, чтобы для определённых сущностей (ServiceOrderItemDetail) он грузил экземпляры с жёстко фиксированной заранее определённой вьюхой, а не пытался построить её динамически.

Спасибо большое!