Ресурс Spring Boot JNDI CommonJ

Попытка заставить WorkManagers работать с CommonJ в приложении Spring Boot, размещенном в TomEE.

На данный момент имеет следующую конфигурацию:

Контекст Tomcat.xml

<Context>
  <Resource name="myWorkManager"
    auth="Container"
    type="commonj.work.WorkManager"
    factory="de.myfoo.commonj.work.FooWorkManagerFactory"
    maxThreads="5" />
  <ResourceLink
    name="myWorkManager"
    global="myWorkManager"
    type="commonj.work.WorkManager" />
</Context>

Весеннее приложение web.xml

<resource-ref>
    <res-ref-name>myWorkManager</res-ref-name>
    <res-type>commonj.work.WorkManager</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

В настоящее время при загрузке приложения возникает следующее исключение:

Caused by: org.springframework.jndi.TypeMismatchNamingException: Object of type [class de.myfoo.commonj.work.FooWorkManager] available at JNDI location [java:comp/env/myWorkManager] is not assignable to [commonj.work.WorkManager]
    at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:182)
    at org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:95)
    at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.afterPropertiesSet(WorkManagerTaskExecutor.java:110)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
    ... 53 more

У меня есть jar-файлы CommonJ, загруженные с http://commonj.myfoo.de/install.shtml в мой каталог lib Tomcat.

Я чувствую, что подхожу довольно близко, но немного озадачен этим исключением.

Любая помощь приветствуется.

ОБНОВЛЕНИЕ

Если я удалю две банки CommonJ из папки TomEE lib, я получу это исключение

Вызвано: java.lang.ClassNotFoundException: commonj.work.WorkManager

Чего я и ожидал.

Если я удалю свойство factory из элемента ресурса, я получу:

Вызвано: org.springframework.jndi.TypeMismatchNamingException: объект типа [класс org.apache.openejb.core.ivm.naming.IvmContext], доступный в расположении JNDI [java:comp/env/wm/default], не может быть назначен [ commonj.work.WorkManager]


person timothyclifford    schedule 25.02.2016    source источник
comment
Убедитесь, что в вашем веб-приложении нет банок.   -  person M. Deinum    schedule 25.02.2016
comment
Обновлено на основе вашего предложения   -  person timothyclifford    schedule 25.02.2016
comment
Нет, не... Вы не должны удалять их из библиотеки tomcat, но вы должны удалить их из каталога lib ваших приложений, т.е. WEB-INF/lib. Вы также, похоже, используете НЕ Tomcat, а TomEE, который немного отличается от других.   -  person M. Deinum    schedule 25.02.2016
comment
Да, извините, я использую TomEE, обновлю вопрос   -  person timothyclifford    schedule 25.02.2016
comment
Я также подтвердил, что этих банок нет в моем приложении.   -  person timothyclifford    schedule 25.02.2016


Ответы (1)


Я сталкиваюсь с той же проблемой, когда пытаюсь запустить приложение локально в maven-jetty-plugin. М. Комментарий Deinum был очень полезным. Эта ошибка возникает, если у вас есть lib jar в общей библиотеке вашего сервера приложений и в папке WEB-INF/lib веб-приложения, потому что сервер использует один jar для создания ресурса (родительский загрузчик классов), но приложение использует собственный jar (дочерний загрузчик классов) и это две разные иерархии классов, поэтому FooWorkManager не может быть приведен к WorkManager.

person Sergey    schedule 06.01.2019