初始化@EJB字段

时间:2012-12-04 08:42:21

标签: java spring jboss ejb

我是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 :我尝试使用另一种方法here来插入bean。也许在回答这个问题时会有所帮助。

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

3 个答案:

答案 0 :(得分:1)

如果您使用JBoss 5,则无法将EJB置于战争中。您需要使用EJB jarwar文件(+ lib jars)创建一个ear文件。有关ear的更多信息可以在JavaEE教程(http://docs.oracle.com/javaee/5/tutorial/doc/bnaby.html)中找到。

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

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

另一个选项是切换到Jboss 7,因为EJB可以在war中。但这需要一些努力,因为他们在Jboss 7中改变了一些东西。

答案 1 :(得分:0)

如果希望Spring在EJB中注入属性,则需要在类上使用Interceptor:

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

        @Autowired
        private CatalogService catalogService;

        ...
}

答案 2 :(得分: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不支持)。