我有以下情况:
@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注释。
有什么想法吗?
答案 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>