Spring Boot JNDI CommonJ资源

时间:2016-02-25 14:08:15

标签: java spring jndi tomee

尝试让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]

1 个答案:

答案 0 :(得分:0)

当尝试在maven-jetty-plugin中本地启动我的应用程序时遇到相同的问题。 M. Deinum条评论非常有帮助。如果您在Application Server的共享库和Web应用程序的WEB-INF / lib文件夹中都有lib jar,则会发生此错误,因为服务器使用一个jar创建资源(父类加载器),而应用程序使用self jar(子类加载器)并且它具有两个不同的类层次结构,因此FooWorkManager无法转换为WorkManager。