Spring: Autowired 在 ejb 中为 null class

Spring: Autowired is null in ejb class

我有以下情况:

    @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();
}

代理class负责查找远程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 是空的。我不知道为什么,因为 IMyRepo 和他的实现总是位于 Spring.

扫描的路径内

只是一个澄清:实现 IMyRepo 的 MyRepo class 用 @Repository 注释。

有什么想法吗?

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

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

// 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 文件(使用您自己的应用程序上下文文件)中定义上下文位置:

应用-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>