我是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的来源,但可以为我的控制器做。
答案 0 :(得分:1)
如果您使用JBoss 5,则无法将EJB
置于战争中。您需要使用EJB
jar
和war
文件(+ 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不支持)。