如何将没有接口的EJB注入Spring bean?

时间:2015-12-29 15:37:00

标签: spring ejb-3.1

我有几个EJB 3.x无状态会话bean,它们没有定义接口。我需要将这些bean注入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>

初始化弹簧容器时,出现以下错误:

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有一个本地接口视图,因为它是业务接口;但是,我没有一个(并且不能介绍一个)。

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:0)

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

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

希望有所帮助。

答案 1 :(得分:0)

在@EJB注释上指定映射名称应该足够了,并从bean.xml中删除local-slsb声明

我不知道为什么Spring需要映射名称或者无法自己解决它。如果您还不知道,请将其从应用程序服务器的调试日志中删除。

<Path force="True">C:\OneB.txt</Path>

}

上面的示例是完整EAR中的全名,如果没有冲突,它也可能绑定到“更短”的jndi名称。

答案 2 :(得分:0)

使用

<jee:jndi-lookup jndi-name="java:app/domains/BaseDao" expected-type="com.project.core.persistence.baseDaoImpl.BaseDao" id="baseDao" ></jee:jndi-lookup>

然后,您可以使用@Autowire 注解注入它或在您的 bean 中声明。

<Bean class ="com.project.springBean" id ="myBean">
<property name="baseDao" ref="baseDao" />
or 
@Component
public class SpringBean {
@AutoWired
private BaseDao baseDao;
public void setBaseDao(BaseDao baseDao) {
this.baseDao =baseDao;

} 如果您使用自动装配与否,您应该在 springBean 类中为 baseDao 设置 setter 方法。

答案 3 :(得分:-1)

如果您只是使用您希望的任何方式声明类型MyNoInterfaceEJB的bean,那就应该没问题。我是这样做的,在我的配置类中:

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

如果删除了<jee:local-slsb>定义,则应该收到不同的错误消息,只需要一个类型为MyNoInterfaceEJB的bean。那就是你做的。