尝试让WorkManagers在TomEE托管的Spring Boot应用程序中使用CommonJ。
目前有以下配置:
Tomcat context.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>
Spring app 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
我在我的Tomcat lib目录中从http://commonj.myfoo.de/install.shtml下载了CommonJ jar。
我觉得自己变得非常接近,但对此异常感到有些困惑。
非常感谢任何帮助。
更新
如果我从TomEE lib文件夹中删除两个CommonJ jar,我会收到此异常
引起:java.lang.ClassNotFoundException:commonj.work.WorkManager
这就是我所期望的。
如果我从资源元素中删除了工厂属性,我得到:
引起:org.springframework.jndi.TypeMismatchNamingException: 类型为[class org.apache.openejb.core.ivm.naming.IvmContext]的对象 在JNDI位置[java:comp / env / wm / default]不可用 可分配给[commonj.work.WorkManager]
答案 0 :(得分:0)
当尝试在maven-jetty-plugin中本地启动我的应用程序时遇到相同的问题。 M. Deinum条评论非常有帮助。如果您在Application Server的共享库和Web应用程序的WEB-INF / lib文件夹中都有lib jar,则会发生此错误,因为服务器使用一个jar创建资源(父类加载器),而应用程序使用self jar(子类加载器)并且它具有两个不同的类层次结构,因此FooWorkManager无法转换为WorkManager。