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>
我有以下情况:
@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>