2015-12-29 62 views
0

我有几个EJB 3.x无状态会话bean,它们没有定义接口。我需要将这些bean注入到Spring bean中,但无法这样做。如何将不带接口的EJB注入到Spring bean中?

无接口EJB:

@Singleton 
public class MyNoInterfaceEJB { 
    public String sayHello() { return "hi"; } 
} 

我的豆:

@Named 
public class MyEJBClientBean { 
    @EJB 
    private MyNoInterfaceEJB testejb; 

    // ... 
} 

而且我bean.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:jee="http://www.springframework.org/schema/jee" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd 
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd"> 

    <jee:local-slsb id="testejb" jndi-name="java:global/MyEAR/MyModule/MyProject!com.test.MyNoInterfaceEJB" 
      business-interface="com.test.MyNoInterfaceEJB"/> 

    <context:annotation-config /> 
    <context:component-scan base-package="com.test" /> 
</beans> 

在Spring容器的初始化,我得到以下错误:

Caused by: org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'testejb': 
Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: [com.test.MyNoInterfaceEJB] is not an interface 

异常本身非常清晰 - Spring容器期望我的bean具有本地接口视图,因为它是业务接口;但是,我没有一个(也不能介绍一个)。

任何帮助,非常感谢!

+0

这是我能找到的最接近的相关问题:http://stackoverflow.com/questions/23008810/ejb-3-injection-into-spring-beans - 但它需要使用远程和本地接口视图,它对我来说不是一种选择。 –

+0

EJB,CDI(正如'@ Named'所暗示的那样,因此,您所说的“控制器”现在由CDI而不是Spring来管理),您应该使用的JPA等是Java EE的一部分。什么让你仍然坚持Spring呢,即你在Spring中使用哪些Java EE中没有的特性? (这不是有争议的,而是一般用例)。 – Tiny

回答

0

例外是弹簧配置文件中<jee:local-slsb>元素的结果。您在元素的business-interface属性中提供实现类。

我不确定Spring是否能够处理spring bean中的@EJB注释。如果没有,你可以让你的spring bean实现Spring接口org.springframework.beans.factory.InitializingBean,并为无接口EJB做一个编程JNDI查找。

希望有所帮助。

+0

是的 - 这就是我要介绍的方向......如果我可以让Spring使用无界面视图自动装入EJB,那么它会简单得多... –

-1

如果您只是使用任何方法声明一个类型为MyNoInterfaceEJB的bean,应该可以。我做到了这样,在我的配置类:

@Bean public MyNoInterfaceEJB myEjb() 
{ 
    return new MyNoInterfaceEJB(); 
} 

如果删除了<jee:local-slsb>定义你应该得到一个不同的错误信息,简单地要求MyNoInterfaceEJB类型的豆。这就是你所做的。

+0

我非常肯定,EJB永远不应该被实例化'new'。在这种情况下,如果您不想使用@EJB注释,则可以使用InitialContext查找它。 – KarlP

0

这应该足以在@EJB批注指定映射的名字,并从bean.xml

我不知道为什么Spring需要映射的名称或无法删除本地SLSB声明找出它自己的。如果您还不知道它,请将它从应用程序服务器的调试日志中提取出来。

@Named 
public class MyEJBClientBean { 

    @EJB(mappedName="java:global/MyApp/MyModule/MyNoInterfaceEJB!com.initech.MyNoInterfaceEJB ") 
    private MyNoInterfaceEJB testejb; 

    // ... 

}

上面的例子是在一个完整的EAR的全名,它可以绑定到“短” JNDI的名字太多,如果没有冲突。