2015-12-29 3 views
0

У меня есть несколько фазовых сессий EJB 3.x, которые не имеют определенных интерфейсов. Мне нужно вставить эти бобы в весенний боб, но я не могу этого сделать.Как я могу ввести EJB без интерфейса в компонент Spring?

Нет интерфейса EJB:

@Singleton 
public class MyNoInterfaceEJB { 
    public String sayHello() { return "hi"; } 
} 

Мой боб:

@Named 
public class MyEJBClientBean { 
    @EJB 
    private MyNoInterfaceEJB testejb; 

    // ... 
} 

И мой bean.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:jee="http://www.springframework.org/schema/jee" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd 
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd"> 

    <jee:local-slsb id="testejb" jndi-name="java:global/MyEAR/MyModule/MyProject!com.test.MyNoInterfaceEJB" 
      business-interface="com.test.MyNoInterfaceEJB"/> 

    <context:annotation-config /> 
    <context:component-scan base-package="com.test" /> 
</beans> 

На инициализации весеннего контейнера, я получаю следующее сообщение об ошибке:

Caused by: org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'testejb': 
Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: [com.test.MyNoInterfaceEJB] is not an interface 

Исключение само по себе очень ясно - весенний контейнер ожидает, что мой bean-компонент имеет локальный интерфейс, поскольку это бизнес-интерфейс; однако у меня его нет (и его не может ввести).

Любая помощь очень ценится!

+0

Это ближайший связанный вопрос, который я мог найти: http://stackoverflow.com/questions/23008810/ejb-3-injection-into-spring-beans - но для этого требуется использование видов удаленного и локального интерфейса, которые для меня это не вариант. –

+0

EJB, CDI (как подразумевается под именем '@ Named'. Таким образом, то, что вы говорите,« Контроллеры »теперь управляются CDI, а не Spring), JPA и т. Д., Которые вы должны использовать, являются частью Java EE. Что заставляет вас по-прежнему придерживаться Spring, то есть какие функции вы используете Spring, которые недоступны в Java EE? (Это не спорный, а общий прецедент). – Tiny

ответ

0

Исключение является результатом элемента <jee:local-slsb> в файле конфигурации пружины. вы предоставляете класс реализации в атрибуте бизнес-интерфейса элемента.

Я не уверен, что Spring может обрабатывать аннотацию @EJB в вашей весенней фасоли. Если нет, вы можете позволить вашему весеннему бобу реализовать интерфейс Spring org.springframework.beans.factory.InitializingBean и выполнить программный поиск JNDI для интерфейса EJB без интерфейса.

Надеюсь, что это поможет.

+0

Да, это направление, в котором я возглавляю ... это было бы намного проще, если бы я мог иметь Spring autowire EJB, используя вид без интерфейса ... –

-1

Это должно быть нормально, если вы просто объявляете фасоль типа MyNoInterfaceEJB, используя любые средства, которые вы хотите. Я сделал это так, в моем классе конфигурации:

@Bean public MyNoInterfaceEJB myEjb() 
{ 
    return new MyNoInterfaceEJB(); 
} 

Если вы удалили <jee:local-slsb> определение вы должны получить другое сообщение об ошибке, просто требует боба типа MyNoInterfaceEJB. Это то, что вы делаете.

+0

Я уверен, что EJB никогда не должны создаваться с помощью 'new'. В этом случае вы можете искать его с помощью InitialContext, если вы не хотите использовать аннотацию @EJB. – KarlP

0

Это должно быть достаточно, чтобы указать переведенное имя на @EJB аннотации, и удалить объявление местного SLSB от bean.xml

Я не знаю, почему весна нуждается отображенным имя или не в состоянии понять это на своем собственном. Извлеките его из журналов отладки с сервера приложений, если вы этого еще не знаете.

@Named 
public class MyEJBClientBean { 

    @EJB(mappedName="java:global/MyApp/MyModule/MyNoInterfaceEJB!com.initech.MyNoInterfaceEJB ") 
    private MyNoInterfaceEJB testejb; 

    // ... 

}

В приведенном выше примере это полное имя в полном EAR, это может быть связано с «коротких» JNDI-имена тоже, если нет никаких конфликтов.