2015-08-31 5 views
1

Используя идею, что мы нашли в:Как EJB могут использовать весенние ботинки?

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/ejb.html#ejb-implementation-ejb3

мы хотели использовать перехватчик для того, чтобы получить доступ к пружинным загрузкам зерна из EJBs. Но проблема в том, что на примере документации используется новый контекст.

Как EJB могут получить доступ к контексту загрузки весны?

Мы попытались это:

public class MySpringActuatorMetricsCoreTestInterceptor extends SpringBeanAutowiringInterceptor { 

     //Spring boot application context 
    @Autowired 
    ApplicationContext applicationContext; 

    @SuppressWarnings("resource") 
    @Override 
    protected BeanFactory getBeanFactory(Object target) { 
     return applicationContext.getAutowireCapableBeanFactory(); 
    } 

} 

И EBJ выглядит следующим образом:

// ejb 
@Stateless 
// spring 
@Interceptors(MySpringActuatorMetricsCoreTestInterceptor.class) 
public class FirstBean { 
[...] 

Проблема заключается в том: контекст приложения не инициализирован, поскольку инициализация EJBs происходит до и как следствие -> исключение нулевого указателя.

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

Есть ли решение? другой вариант?

Мы используем Glassfish 3.1

Спасибо!

+0

EJBs и Spring Boot кажутся мне ортогональными. Мое предпочтение - Spring и Spring Boot. Отрежьте EJB. – duffymo

+0

Я тоже не нашел пути, лучший вариант, вероятно, заключался бы в том, чтобы разоблачить услуги как услуги отдыха с использованием весеннего ботинка и весеннего отдыха. Потребление ejbs в весеннем ботинке однако возможно. – werner

ответ

2

Ok я нашел способ, как кажется: я просто добавил beanRefContext.xml моему: классам <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans_2_0.dtd"> <beans> <bean class="org.springframework.context.support.ClassPathXmlApplicationContext"> <constructor-arg value="classpath*:simpleContext.xml" /> </bean> </beans>

, который ссылается на новый файл с именем ApplicationContext simpleContext.xml также в моем пути к классам:

... 
<!-- Enable annotation support within our beans --> 
<context:annotation-config/> 
<context:spring-configured/> 
<context:component-scan base-package="your.package.path" /> 
<context:property-placeholder location="classpath*:*.properties" /> 

...

Теперь я был в состоянии придать весной загрузочные услуги в мой EJB:

@Stateless(name = "RightsServiceEJB") 
@Remote 
@Interceptors(SpringBeanAutowiringInterceptor.class) 
public class RightsServiceEJB implements IRightsServiceEJB { 

    @Autowired 
    ExampleService exampleService; 

    @Override 
    public String sayHello() { 
     return exampleService.sayHello(); 
    } 

}

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

+0

Хорошо, я просто оценил этот метод против службы, которая использует db, и, похоже, она работает, служба по-прежнему обращается к моему db и возвращает правильное значение. – werner

+0

Как вам кажется, вам нужно добавить весь компонентный сканер для вашего приложения загрузки весны. Весенняя загрузка затем запускается второй раз для инфраструктуры ejb со своим собственным контекстом приложения. Таким образом, конфигурация распределяется по ejb и экземплярам приложения. Однако вы должны иметь это в виду, что теперь вы имеете дело с двумя отдельными контекстами приложений в вашем запущенном приложении: одно для основного приложения и одно для ejbs. – werner