2016-09-20 89 views
0

我有一個使用spring在Java 1.8中構建的Web應用程序,並部署在Tomcat上。 我們有使用EJB在Java 1.4中編寫的第三方庫。從Spring訪問EJB類

我的應用程序需要從我們的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之前。你能否讓我知道我錯過了什麼。

回答

1

原因是在這裏:

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

爲了解決這個問題,你需要指定正確的JNDI名稱作爲財產jndiName值。您必須找出在JNDI中可用的EJB的正確名稱。

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

0

正如你在提供的文檔中解釋的,我認爲更簡單的是使用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> 
+0

EJB類是第三方,我們無法控制它。 –

+0

在哪裏部署EJB? –

+0

EJB作爲jar文件提供給我們,我們將其作爲項目的依賴項添加進來。因此,它在我們的應用程序上部署在Tomcat服務器上。 –

0

如果你能夠部署和運行在兼容的容器中的「庫」,那麼一個可能的解決辦法是,使用特定的庫的遠程接口,如果這些都可以從你的春天應用程序單獨運行