2015-08-31 189 views
1

使用,我們發現這個想法:EJB如何使用彈簧引導bean?

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

我們想利用攔截器,以便從一個EJB的訪問春天開機豆。但問題是,文檔的示例使用了新的上下文。

EJB如何訪問spring引導上下文?

我們嘗試這樣做:

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 { 
[...] 

的問題是:應用程序上下文尚未初始化,因爲EJB的初始化之前並因此發生了 - >空指針異常。

我們認爲有兩種選擇: - 我們從彈簧引導中獲得應用程序上下文。 - 我們可以將MySpringActuatorMetricsCoreTestInterceptor創建的上下文提供給Spring引導上下文。

有沒有解決方法?另外一個選擇?

我們使用的是GlassFish 3.1

謝謝!

+0

EJB和Spring Boot似乎與我正交。我的首選是Spring和Spring Boot。拋棄EJB。 – duffymo

+0

我還沒有找到方法,最好的辦法可能是將服務作爲使用彈簧靴和彈簧休息的休息服務。 然而,在春季引導消費ejbs是可能的。 – werner

回答

2

好,我找到了一種方法,因爲它似乎: 我只是增加了一個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>

引用名爲simpleContext.xml一個新的applicationContext文件也是在我的類路徑:

... 
<!-- 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(); 
    } 

}

然而,這是現在一個小型的Hello World示例,我不知道如果彈簧服務仍可以參考由Spring啓動初始化資源。這需要我的進一步測試。

+0

好吧我只是評估這種方法對使用數據庫的服務,它似乎工作,該服務仍然訪問我的數據庫並返回一個正確的值。 – werner

+0

好吧,你必須爲你的彈簧啓動應用程序添加整個組件掃描。然後,Spring引導會再次啓動ejb基礎架構和自己的應用程序上下文。這樣配置就通過ejb和應用程序實例共享。但是,您必須記住,您現在正在運行的應用程序中處理兩個單獨的應用程序上下文,一個用於主應用程序,另一個用於ejbs。 – werner