EJB 如何使用 spring boot bean?

use*_*436 5 glassfish-3 spring-boot

使用我们在以下内容中发现的想法:

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

我们想使用拦截器来从 EJB 访问 Spring Boot bean。但问题是,文档的示例使用了新的上下文。

EJB 如何访问 spring boot 上下文?

我们试过这个:

public class MySpringActuatorMetricsCoreTestInterceptor extends SpringBeanAutowiringInterceptor {

        //Spring boot application context
    @Autowired
    ApplicationContext applicationContext;

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

}
Run Code Online (Sandbox Code Playgroud)

EBJ 看起来像这样:

// ejb
@Stateless
// spring
@Interceptors(MySpringActuatorMetricsCoreTestInterceptor.class)
public class FirstBean {
[...]
Run Code Online (Sandbox Code Playgroud)

问题是:应用程序上下文尚未初始化,因为 EJB 初始化发生在之前并因此发生 -> 空指针异常。

我们认为有两种选择: - 我们以某种方式从 Spring Boot 中获取应用程序上下文。- 我们可以将我们可以通过 MySpringActuatorMetricsCoreTestInterceptor 创建的上下文提供给 spring 引导上下文。

有什么解决办法吗?另外一个选项?

我们正在使用 Glassfish 3.1

谢谢!

小智 4

好吧,我找到了一种方法:我刚刚将 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" />
Run Code Online (Sandbox Code Playgroud)

...

现在我可以将 Spring Boot 服务注入到我的 EJB 中:

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

   @Autowired
   ExampleService exampleService;

   @Override
   public String sayHello() {
      return exampleService.sayHello();
   }
Run Code Online (Sandbox Code Playgroud)

}

然而,这现在只是一个小的 hello world 示例,我不确定 Spring 服务是否仍然可以引用 Spring boot 初始化的资源。这需要我这边进一步测试。