Spring:在ejb类

时间:2015-04-26 19:00:10

标签: spring ejb repository autowired inject

我有以下情况:

    @Controller
    public class myController {
        @Autowired
        private IProxy service;

        public ModelAndView init(HttpServletRequest request, HttpServletResponse response) throws Exception {
          List<String> list = service.getName();
        }
    } 

然后我的服务定义如下:

public interface IProxy {
    public List<String> getName();
}

Proxy类负责查找远程bean

@Service("service")
public class Proxy implements IProxy {
...
public List<String> getName() {
   return myClass.getName();
}

实施如下:

@Interceptors(interceptor.class)
@Stateless
@Resource(name = "java:/db")
@Remote(MyClassRemote.class)
public class MyClassImpl extends MyEjb implements MyClassRemote{

    @PersistenceContext(unitName = "db")
    private EntityManager em;
    @Resource
    private SessionContext sctx;
    @Autowired
    public IMyRepo myRepo;

    @Override
    public List<String> getName() {
        try {
             return myRepo.getName(em);
        }
        catch (Exception ex) {
            ex.printStackTrace();
            throw ex;
        }
        finally {}
    }

所以,问题是myRepo在这里是null。我不知道为什么因为IMyRepo和他的实现总是位于Spring扫描的路径中。

只需澄清一点:实现IMyRepo的MyRepo类使用@Repository注释。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

Spring bean和EJB是两个不同的东西,你不能只在EJB中注入一个Spring bean,因为那个EJB不是Spring bean,所以Spring不知道有一个应该由Spring注入的字段(除非你使用一些花哨的AOP东西,它可以注入非Spring管理的bean)。

答案 1 :(得分:1)

您可以使用Spring拦截器在EJB中注入spring bean,正如官方文档中的here所述。基本上你需要按如下方式调整你的课程:

// added the SpringBeanAutowiringInterceptor class
@Interceptors({ interceptor.class, SpringBeanAutowiringInterceptor.class })
@Stateless
@Resource(name = "java:/db")
@Remote(MyClassRemote.class)
public class MyClassImpl extends MyEjb implements MyClassRemote{
  // your code
}

您还需要在beanRefContext.xml文件中定义上下文位置(使用您自己的应用程序上下文文件):

application-context.xml版本

<bean id="context"
    class="org.springframework.context.support.ClassPathXmlApplicationContext">
    <constructor-arg>
        <list>
            <value>application-context.xml</value>
        </list>
    </constructor-arg>
</bean>

Java配置版本:

<bean id="context"
    class="org.springframework.context.annotation.AnnotationConfigApplicationContext">
    <constructor-arg>
        <list>
        <value type="java.lang.Class">com.your.app.Configuration</value>
        </list>
    </constructor-arg>
</bean>