Additional datastore компонента

Доброго дня.

Подскажите, пожалуйста. возможно ли подключить компонент, в котором используется additional datastore? Попытавшись на старте получаю:

trace
Error creating bean with name 'cubaDataSource_fiasDs' defined in class path resource [.../spring.xml]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'jndiName' is required
1 симпатия

Добрый день!

Можно, но в проекте вам нужно повторно определить additional data store, используемый в аддоне.

1 симпатия

Константин, добрый день.

Похоже что этого не достаточно…

Сведения
2019-07-08 22:05:32.396 ERROR [localhost-startStop-1] com.haulmont.cuba.core.sys.AbstractWebAppContextLoader - Error initializing application
java.lang.IllegalArgumentException: MetaClass not found for class com.groupstp.fias.entity.FiasEntity
        at com.haulmont.cuba.core.sys.CachingMetadataSession.getClassNN(CachingMetadataSession.java:84) ~[cuba-global-6.10.10.jar:6.10.10]
        at com.haulmont.cuba.core.sys.MetadataImpl.getClassNN(MetadataImpl.java:330) ~[cuba-global-6.10.10.jar:6.10.10]
        at com.haulmont.cuba.core.sys.AbstractViewRepository.getMetaClass(AbstractViewRepository.java:670) ~[cuba-global-6.10.10.jar:6.10.10]
        at com.haulmont.cuba.core.sys.AbstractViewRepository.checkDuplicates(AbstractViewRepository.java:125) ~[cuba-global-6.10.10.jar:6.10.10]
        at com.haulmont.cuba.core.sys.AbstractViewRepository.init(AbstractViewRepository.java:111) ~[cuba-global-6.10.10.jar:6.10.10]
        at com.haulmont.cuba.core.sys.AbstractViewRepository.checkInitialized(AbstractViewRepository.java:86) ~[cuba-global-6.10.10.jar:6.10.10]
        at com.haulmont.cuba.core.sys.AbstractViewRepository.findView(AbstractViewRepository.java:236) ~[cuba-global-6.10.10.jar:6.10.10]
        at com.haulmont.cuba.core.sys.AbstractViewRepository.getView(AbstractViewRepository.java:208) ~[cuba-global-6.10.10.jar:6.10.10]
        at com.haulmont.cuba.core.global.LoadContext.setView(LoadContext.java:153) ~[cuba-global-6.10.10.jar:6.10.10]
        at com.haulmont.cuba.security.app.UserSessionLogBean.lambda$closeDeadSessionsOnStartup$4(UserSessionLogBean.java:178) ~[cuba-core-6.10.10.jar:6.10.10]
        at com.haulmont.cuba.security.app.Authentication.withSystemUser(Authentication.java:201) ~[cuba-core-6.10.10.jar:6.10.10]
        at com.haulmont.cuba.security.app.UserSessionLogBean.closeDeadSessionsOnStartup(UserSessionLogBean.java:177) ~[cuba-core-6.10.10.jar:6.10.10]
        at com.haulmont.cuba.security.app.UserSessionLogBean$1.applicationStarted(UserSessionLogBean.java:205) ~[cuba-core-6.10.10.jar:6.10.10]
        at com.haulmont.cuba.core.sys.AppContext.startContext(AppContext.java:239) ~[cuba-global-6.10.10.jar:6.10.10]
        at com.haulmont.cuba.core.sys.AppContext$Internals.startContext(AppContext.java:302) ~[cuba-global-6.10.10.jar:6.10.10]
        at com.haulmont.cuba.core.sys.AbstractWebAppContextLoader.contextInitialized(AbstractWebAppContextLoader.java:86) ~[cuba-global-6.10.10.jar:6.10.10]
        at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4792) [catalina.jar:8.5.33]
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5256) [catalina.jar:8.5.33]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [catalina.jar:8.5.33]
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:754) [catalina.jar:8.5.33]
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:730) [catalina.jar:8.5.33]
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734) [catalina.jar:8.5.33]
        at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1140) [catalina.jar:8.5.33]
        at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1875) [catalina.jar:8.5.33]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_202]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_202]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_202]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_202]
        at java.lang.Thread.run(Thread.java:748) [na:1.8.0_202]

PS: Понял. Нужно определить не только датастор, но и сущности из компонента в нем.

Добрый день!

Никаких сущностей дублировать не надо. Просто заведите в проекте Additional Datastore с тем же именем и того же типа что и в компоненте. Студия добавит необходимую конфигурацию.

Например, если у вас в компоненте есть datastore с именем data типа PostgreSQL, то в проекте должны появится такие свойства (см. app.properties):

cuba.additionalStores=data
cuba.persistenceConfig_data=+com/company/orders/data-persistence.xml
cuba.dbmsType_data=postgres
cuba.dataSourceJndiName_data=jdbc/data

Константин, именно так и пробовал.
Получил: java.lang.IllegalArgumentException: MetaClass not found for class com.groupstp.fias.entity.FiasEntity.
Проверю еще раз.

fiasDs-persistence.xml компонентна
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             version="2.0">
    <persistence-unit name="fiasDs"
                      transaction-type="RESOURCE_LOCAL">
        <class>com.groupstp.fias.entity.Region</class>
        <class>com.groupstp.fias.entity.Autonomy</class>
        <class>com.groupstp.fias.entity.Community</class>
        <class>com.groupstp.fias.entity.Location</class>
        <class>com.groupstp.fias.entity.Street</class>
        <class>com.groupstp.fias.entity.FiasEntity</class>
        <class>com.groupstp.fias.entity.City</class>
        <class>com.groupstp.fias.entity.Area</class>
        <class>com.groupstp.fias.entity.House</class>
    </persistence-unit>
</persistence>
app.properties компонента
cuba.additionalStores = fiasDs
cuba.persistenceConfig_fiasDs = +com/groupstp/fias/fiasDs-persistence.xml
cuba.dbmsType_fiasDs = postgres
cuba.dataSourceJndiName_fiasDs = jdbc/fiasDs

Попробовал такие варианты:

  1. Добавил с помощью студии датастор
fiasDs-persistence.xml проекта
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             version="2.0">
    <persistence-unit name="fiasDs"
                      transaction-type="RESOURCE_LOCAL">
    </persistence-unit>
</persistence>
app.properties проекта
cuba.additionalStores = fiasDs
cuba.persistenceConfig_fiasDs = +com/groupstp/rtneo/fiasDs-persistence.xml
cuba.dbmsType_fiasDs = postgres
cuba.dataSourceJndiName_fiasDs = jdbc/fiasDs
web-app.properties
cuba.persistenceConfig_fiasDs = +com/groupstp/rtneo/fiasDs-persistence.xml

При старте приложения ошибка: java.lang.IllegalArgumentException: MetaClass not found for class com.groupstp.fias.entity.FiasEntity

  1. Меняю classpath в свойствах проекта
app.properties проекта
cuba.additionalStores = fiasDs
cuba.persistenceConfig_fiasDs = +com/groupstp/fias/fiasDs-persistence.xml
cuba.dbmsType_fiasDs = postgres
cuba.dataSourceJndiName_fiasDs = jdbc/fiasDs
web-app.properties
cuba.persistenceConfig_fiasDs = +com/groupstp/fias/fiasDs-persistence.xml

Приложение стартует.
Но при попытке выполнения сервиса получаю:

Сведения
com.haulmont.cuba.web.gui.executors.impl.WebBackgroundWorker - Exception in background task
java.util.concurrent.ExecutionException: com.haulmont.cuba.core.global.RemoteException:
---
java.lang.IllegalArgumentException: Unknown Entity bean class: class com.groupstp.fias.entity.Region, please verify that this class has been marked with the @Entity annotation.
        at java.util.concurrent.FutureTask.report(FutureTask.java:122) ~[na:1.8.0_202]
        at java.util.concurrent.FutureTask.get(FutureTask.java:192) ~[na:1.8.0_202]
        at com.haulmont.cuba.web.gui.executors.impl.WebBackgroundWorker$WebTaskExecutor.handleDone(WebBackgroundWorker.java:278) ~[cuba-web-6.10.10.jar:6.10.10]
        at com.haulmont.cuba.web.gui.executors.impl.WebBackgroundWorker$WebTaskExecutor$1.lambda$done$0(WebBackgroundWorker.java:187) [cuba-web-6.10.10.jar:6.10.10]
        at com.vaadin.ui.UI.accessSynchronously(UI.java:1392) ~[vaadin-server-7.7.15.cuba.11.jar:7.7.15.cuba.11]
        at com.vaadin.ui.UI$4.run(UI.java:1458) ~[vaadin-server-7.7.15.cuba.11.jar:7.7.15.cuba.11]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_202]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_202]
        at com.vaadin.server.VaadinService.runPendingAccessTasks(VaadinService.java:1861) ~[vaadin-server-7.7.15.cuba.11.jar:7.7.15.cuba.11]
        at com.vaadin.server.VaadinSession.unlock(VaadinSession.java:996) ~[vaadin-server-7.7.15.cuba.11.jar:7.7.15.cuba.11]
        at com.vaadin.server.VaadinService.ensureAccessQueuePurged(VaadinService.java:1824) ~[vaadin-server-7.7.15.cuba.11.jar:7.7.15.cuba.11]
        at com.vaadin.server.VaadinService.accessSession(VaadinService.java:1790) ~[vaadin-server-7.7.15.cuba.11.jar:7.7.15.cuba.11]
        at com.vaadin.server.VaadinSession.access(VaadinSession.java:1401) ~[vaadin-server-7.7.15.cuba.11.jar:7.7.15.cuba.11]
        at com.vaadin.ui.UI.access(UI.java:1455) ~[vaadin-server-7.7.15.cuba.11.jar:7.7.15.cuba.11]
        at com.haulmont.cuba.web.gui.executors.impl.WebBackgroundWorker$WebTaskExecutor$1.done(WebBackgroundWorker.java:186) [cuba-web-6.10.10.jar:6.10.10]
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:384) ~[na:1.8.0_202]
        at java.util.concurrent.FutureTask.setException(FutureTask.java:251) ~[na:1.8.0_202]
        at java.util.concurrent.FutureTask.run(FutureTask.java:271) ~[na:1.8.0_202]
        at com.haulmont.cuba.web.gui.executors.impl.WebBackgroundWorker$WebTaskExecutor.lambda$startExecution$1(WebBackgroundWorker.java:376) ~[cuba-web-6.10.10.jar:6.10.10]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_202]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_202]
        at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_202]

Region - это наследник FiasEntity.

Добавлю также, что пробовал в сервисе использовать em с указанием конкретного датастора, а так же dm.
Платформа 6.10.8

А какой у вас базовый пакет в компоненте и в приложении?
Почему cuba.persistenceConfig_fiasDs = +com/groupstp/fias/fiasDs-persistence.xml одинаковый и в компонте и в приложении?

Это уже от безысходности эксперимент.
Если в базовом приложении cuba.persistenceConfig_fiasDs = +com/groupstp/rtneo/fiasDs-persistence.xml
а в компоненте cuba.persistenceConfig_fiasDs = +com/groupstp/fias/fiasDs-persistence.xml
то получаю на старте приложения, как я писал выше:
java.lang.IllegalArgumentException: MetaClass not found for class com.groupstp.fias.entity.FiasEntity

Надеюсь на вашу дальнейшую помощь.

Может вы компонент как-то неудачно добавили в приложение?
Убедитесь что он указан в web.xml обоих блоков приложения.

Если имеете в виду в базовом приложении <context-param> <param-name>appComponents</param-name> то, компонент присутствует во обоих модулях (web и core).

Если что-то еще, уточните, пожалуйста.

Также уточню еще раз, что если задублировать в fiasDs-persistence.xml (тут правда при открытии проекта студия ругается на отсутствующие в проекте сущностей) сущности из компонента или использовать трюк с подменой classpath для fiasDs-persistence.xml в свойствах базового приложения на classpath компонента, то приложение стартует. Более того экраны компонента работают и могут создавать сущности, в отличии от сервиса компонента.
Допускаю, что проблема может быть именно в сервисе. На что тут можно обратить внимание?
Пожалуй, я не проверял только создание наследников FiasEntity (того же Region, например). Пойду грувиком попробую создать.
UPD проверил. грувиком создается нормально. Т.е. проблема либо в сервисе, либо в том, что сервис в компоненте.