繁体   English   中英

从Spring访问EJB类

[英]Accessing EJB classes from Spring

我有一个使用Spring在Java 1.8中构建并部署在Tomcat上的Web应用程序。 我们有一个使用EJB用Java 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工作不多。 你能让我知道我在想什么。

原因在这里:

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

为了解决此问题,您需要指定正确的JNDI名称作为属性jndiName的值。 您必须弄清楚在JNDI中可以使用MyComponent EJB的正确名称。

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

正如您提供的文档中所解释的那样,我认为将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>

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM