Добрый день!
Подскажите, пожалуйста, какие представления используются для инспектора сущностей?
Пытаюсь открыть сущность через инспектор, получаю ошибку.
Добрый день!
Подскажите, пожалуйста, какие представления используются для инспектора сущностей?
Пытаюсь открыть сущность через инспектор, получаю ошибку.
Добрый!
Какая у вас версия платформы? Исходный код класса с сущностью можете привести?
Спасибо большое за ответ, вопрос очень актуальный.
Версия 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 КБ)
Здравствуйте!
Не используете ли вы BeforeDetachEntityListener сущности ServiceOrder с какой-нибудь логикой, которая может вызывать unfetched attribute access error?
Здравствуйте!
Не использую.
В коде сущностей сходу ничего криминального не видно. Соберите, пожалуйста, нужные сущности в проект, и приложите зипник с этим проектом сюда. Также опишите последовательность шагов, которую нужно выполнить в этом проекте для воспроизведения ошибки. В этом случае мы быстрее сможем понять в чём проблема.
Прикладываю проект и дамп базы данных, пароль в приложение стандартный.
Нужно в инспекторе сущностей выбрать сущность ServiceOrder, там одна сущность, нажать “Edit”, тогда появится ошибка.
Заранее спасибо за любой ответ, очень ждем!
entinspdb_221025.7z (22.6 КБ)
entity_inspector.zip (172.2 КБ)
Если 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 КБ)
Вы можете добавить нужный атрибут в виде 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
Можете приложить пример работающего проекта?
Да, прошу прощения, скорее всего я открыл экран какой-то другой сущности и поэтому подумал, что подобный подход заработал. Похоже, через точку вложенные проперти указать не получится. Да и загрузить related сущность с определённой вью тоже вряд ли получится в методе с @MetaProperty
.
А вам обязательно нужно, чтобы вычисление SallaryPlan было именно внутри кода сущности и именно через MetaProperty? Боюсь, что в EntityInspector подобная сущность так просто не отобразится. Сходу приходят в голову следующие варианты решения проблемы:
ServiceOrderItemDetailUtils.calculateSalaryPlan(ServiceOrderItemDetail itemDetail)
. Когда вам нужно будет вычислить значение свойства, вы будете вызывать этот сервис, передавая аргументом нужный ServiceOrderItemDetail. Из сущности соответственно этот метод вы уберёте. В entity inspector вы это значение не увидите при подобном подходе.ServiceOrderItemDetail.salaryPlan
.Спасибо большое!