【问题标题】:Accessing EJB classes from Spring从 Spring 访问 EJB 类
【发布时间】:2016-09-20 13:28:10
【问题描述】:

我有一个使用 spring 在 Java 1.8 中构建并部署在 Tomcat 上的 Web 应用程序。 我们有一个使用 EJB 用 Ja​​va 1.4 编写的第三方库。

我的应用程序需要从我们的 Spring Web 应用程序访问第三方库中存在的方法。

到目前为止,我根据此链接完成了以下操作。 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/ejb.html

在我的 servlet-context.xml 中,我添加了

<beans:bean id="myComponent"
       class="org.springframework.ejb.access.LocalStatelessSessionProxyFactoryBean">
        <beans:property name="jndiName" value="jndi/ejb/AssociateSessionEJB"/>
        <beans:property name="businessInterface" value="com.company.serviceImpl.MyComponent"/>
    </beans:bean>

 <beans:bean id="loginService" class="com.company.serviceImpl.LoginServiceImpl">
        <beans:property name="myComponent" ref="myComponent"/>
 </beans:bean>

我收到以下错误

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginService' defined in ServletContext resource [/WEB-INF/spring/appServlet/servlet-context.xml]: Cannot resolve reference to bean 'myComponent' while setting bean property 'myComponent'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myComponent' defined in ServletContext resource [/WEB-INF/spring/appServlet/servlet-context.xml]: Invocation of init method failed; nested exception is javax.naming.NameNotFoundException: Name [jndi/ejb/AssociateSessionEJB] is not bound in this Context. Unable to find [jndi].
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1481)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1226)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:187)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1208)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1048)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1018)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:570)
    ... 38 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myComponent' defined in ServletContext resource [/WEB-INF/spring/appServlet/servlet-context.xml]: Invocation of init method failed; nested exception is javax.naming.NameNotFoundException: Name [jndi/ejb/AssociateSessionEJB] is not bound in this Context. Unable to find [jndi].
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351)
    ... 52 more

我以前没有过多地使用 EJB。你能告诉我我错过了什么吗?

【问题讨论】:

    标签: java spring spring-mvc tomcat ejb


    【解决方案1】:

    原因在这里:

    nested exception is javax.naming.NameNotFoundException: Name [jndi/ejb/AssociateSessionEJB] is not bound in this Context. Unable to find [jndi].
    

    为了解决这个问题,您需要指定正确的 JNDI 名称作为属性 jndiName 的值。您必须找出正确的名称,MyComponent EJB 在 JNDI 中可用。

    另一件事是使用 EJB 的应用程序不能部署在 Tomcat 上,它是一个 servlet 容器。您需要使用例如TomEE 或其他 JEE 应用服务器。

    【讨论】:

      【解决方案2】:

      如果您能够在兼容的容器中部署和运行“库”,那么可能的解决方案是使用特定库的远程接口(如果这些接口可用)从单独运行的 Spring 应用程序中使用。

      【讨论】:

        【解决方案3】:

        正如您提供的文档中所解释的那样,我认为更简单的是将 ejb 类用作 POJO。

        <beans:bean id="myComponent"
                   class="com.company.serviceImpl.MyComponent"> 
        </beans:bean>
        <beans:bean id="loginService" class="com.company.serviceImpl.LoginServiceImpl">
                    <beans:property name="myComponent" ref="myComponent"/>  
        </beans:bean>
        

        【讨论】:

        • EJB 类是第三方的,我们无法控制它。
        • EJB部署在哪里?
        • EJB 作为 jar 文件提供给我们,我们将其作为依赖项添加到我们的项目中。因此,它与我们的应用程序一起部署在 Tomcat 服务器上。
        • 所以你可以把它当作POJO来使用,就像一个简单的库一样。您不需要对 JEE 服务器进行远程调用。以 Spring 经典方式注入你需要的类。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-21
        • 1970-01-01
        • 1970-01-01
        • 2011-05-19
        • 2011-04-29
        相关资源
        最近更新 更多