1

我是 EJB 的新手。

我有一门包含以下字段的课程

@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class MyServiceFacadeBean implements MyServiceFacadeLocal, MyServiceFacadeRemote {

    @EJB(name = "ejb/CatalogService")
    private CatalogService catalogService = null;
    ....
}

我在 Sring IOC 中注入实现时实例化了该对象:

<bean id="contestServiceFacade" class="my.company.service.facade.contest.ejb.MyServiceFacadeBean">
 </bean>

但是在我的控制器中调用它方法后,我在catalogService字段上得到NullPointerException 。那么我的门面应该如何正确实例化呢?

更新 1:我尝试使用此处询问的另一种方法来插入 bean 。也许在回答这个问题时会有所帮助。

更新 2:我无法更改我的 EJB 的来源,但可以为我的控制器做到这一点。

4

3 回答 3

1

如果您使用的是 JBoss 5,则不能将其投入EJB战争。您需要使用EJB jarwar文件(+ lib jars)创建一个ear 文件。有关更多信息ear,请参阅 JavaEE 教程 ( http://docs.oracle.com/javaee/5/tutorial/doc/bnaby.html )。

当 EJB 正确打包到 ear 中时,它们将在部署时由 Jboss 启动。

Spring 将能够通过 JDNI 访问它们,如下所述:http: //static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/ejb.html

另一种选择是切换到 Jboss 7,EJB因为war. 但这需要一些努力,因为他们在 Jboss 7 中改变了很多东西。

于 2012-12-10T17:31:27.293 回答
0

如果你想让 Spring 在你的 EJB 中注入属性,你需要在你的类上使用一个拦截器:

@Interceptors(SpringBeanAutowiringInterceptor.class)
public class MyServiceFacadeBean ... {

        @Autowired
        private CatalogService catalogService;

        ...
}
于 2012-12-11T12:42:51.713 回答
0

您正在混合 EJB 和 Spring bean。注释@EJB 是获取企业Java bean 而不是Spring bean。
您应该更改为 @Autowired 注释或将 CatalogService 更改为 EJB(在类中使用正确的 EJB 注释)和

<context:component-scan base-package="com.foo" />

在 xml 文件中。

另请注意,您需要一个支持 EJB 的容器,例如 Glassfish、JBoss(Tomcat 不是)。

于 2012-12-12T08:58:04.747 回答