【问题标题】:EJB 3 injection into spring beansEJB 3 注入 Spring bean
【发布时间】:2014-05-25 09:15:39
【问题描述】:

我已经用spring,spring security制作了一个mavenized web应用程序......现在,我想添加用于数据库访问的ejb模块,我在互联网上寻找但我没有找到明确的东西,因为这是我第一次与 EJB。 我想在我的控制器中使用类似 @EJB 的东西 喜欢”

@Stateless(name = "CustomerServiceImpl")
public class CustomerServiceImpl implements CustomerService 


@EJB
private MyEjb myEjb;

如果有教程或任何其他帮助,我如何在 spring 上下文中配置它。会很棒的,谢谢你

【问题讨论】:

    标签: java spring jakarta-ee ejb-3.0


    【解决方案1】:

    看看这里:http://docs.spring.io/spring/docs/4.1.0.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/#ejb-access-local

    您可以使用 setter 注入来注入 EJB。以这种方式配置您的 bean:

    <bean id="myComponent" class="org.springframework.ejb.access.LocalStatelessSessionProxyFactoryBean">
        <property name="jndiName" value="ejb/myBean"/>
        <property name="businessInterface" value="com.mycom.MyComponent"/>
    </bean>
    
    <bean id="myController" class="com.mycom.myController">
        <property name="myComponent" ref="myComponent"/>
    </bean>
    

    你也可以使用&lt;jee:local-slsb&gt;标签来注入你的EJB:

    <jee:local-slsb id="myComponent" jndi-name="ejb/myBean"
            business-interface="com.mycom.MyComponent"/>
    
    <bean id="myController" class="com.mycom.myController">
        <property name="myComponent" ref="myComponent"/>
    </bean>
    

    【讨论】:

    • 我试过了,但是 jboss 一直告诉我他找不到 jndi 名称...所以我删除了这个,我只使用了@EJB,一切正常!!!!那是对的吗 ?注意:我的战争使用 ejb 模块作为依赖项
    【解决方案2】:

    要在 spring bean 中注入您的 ejb 3 bean,您可以按照以下步骤操作。 1. 创建你的 Spring bean 2. 使用远程和本地接口创建您的 EJB 3.编写实现类 例如

    package com.ejb;
    @Local
    public interface MyEjbLocal{
           public String sendMessage();
    }
    
    package com.ejb;
    @Remote
    public interface MyEjbRemote{
           public String sendMessage();
    }
    
    @Stateless(mappedName = "ejb/MessageSender")
    public class MyEjbImpl implements MyEjbLocal, MyEjbRemote{
     public String sendMessage(){
       return "Hello";   
     }
    }
    

    以上是同时使用远程和本地接口的 EJB3 示例

    现在我们创建注入这个 ejb 的 Spring bean。

    package com.ejb;
    
    @Service
    public class MyService {
    
       private MyEjbLocal ejb;
    
       public void setMyEjbLocal(MyEjbLocal ejb){
            this.ejb = ejb;
      }
    
      public MyEjbLocal getMyEjbLocal(){
           return ejb;
      }
    }
    

    我们在 spring 中添加了 ejb 的实例,但是我们需要在 spring 的 spring-config.xml 中注入它。 在spring bean中注入ejb有两种方式

    1. 第一路
    <bean id ="myBean" class="org.springframework.ejb.access.LocalStetelessSessionProxyFactoryBean">
           <property name="jndiName" value="ejb/MessageSender#com.ejb.MyEjb=Local />
           <property name="businessInterface" value="com.ejb.MyEjbLocal" />
    </bean>
    

    注意:这里我使用的是本地接口,你可以根据需要使用远程。

    1. 另一种注入 ejb 的方法是
    <jee:remote-slsb id="messageSender"
    jndi-name="ejb/MessageSender#com.ejb.MyEjbLocal"
               business-interface="com.ejb.MyEjbLocal"
               home-interface="com.ejb.MyEjbLocal"
               cache-home="false" lookup-home-on-startup="false"
               refresh-home-on-connect-failure="true" />
    

    因此,当 bean 被初始化时,ejb 将被注入到你的 spring bean 中。

    【讨论】:

    • 第一种方法对我有用!谢谢!但请注意 LocalStatelessSessionProxyFactoryBean 在第一个示例中拼写错误。在我意识到之前,我不得不面对 ClassNotFoundException 一段时间。
    猜你喜欢
    • 2014-10-12
    • 2012-01-01
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    相关资源
    最近更新 更多