2016-09-20 4 views
0

У меня есть веб-приложение, встроенное в Java 1.8 с использованием Spring и развернутое на Tomcat. У нас есть сторонняя библиотека, написанная на Java 1.4 с использованием EJB.Доступ к классам EJB из Spring

Мое приложение должно получить доступ к методам, присутствующим в сторонней библиотеке, из нашего весеннего веб-приложения.

До сих пор, я делаю следующее по этой ссылке. http://docs.spring.io/spring/docs/current/spring-framework-reference/html/ejb.html

В моем сервлет-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. Вы должны выяснить правильное имя, под которым MyComponent EJB доступен в JNDI.

Другое дело, что приложение, использующее EJB, не может быть развернуто на Tomcat, который является контейнером сервлетов. Вы должны использовать, например. 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

Если вы в состоянии развернуть и запустить «библиотеку» в совместимом контейнере, то возможным решением может быть, чтобы использовать удаленные интерфейсы конкретной библиотеки, если они имеются, с вашей весны приложение работает отдельно.

Смежные вопросы