我有一个根上下文文件(applicationContext.xml)和一个子上下文文件(subContext.xml)。
当我尝试从subContext.xml中的applicationContext.xml访问bean时,我得到NoSuchBeanDefinitionException
subContext.xml bean:
<bean id="myInfo" factory-bean="myInfoFactory"
factory-method="getInstance" scope="request">
<aop:scoped-proxy proxy-target-class="true" />
applicationContext.xml bean:
<bean id="myInfoFactory"
class="org.wcw.factory.MyInfoFactory" />
我得到的错误是
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'myInfoFactory' is defined
的web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
portlet.xml中
<portlet-class>org.springframework.web.portlet.DispatcherPortlet</portlet-class>
<init-param>
<name>contextConfigLocation</name>
<value>/WEB-INF/subContext.xml</value>
</init-param>
如果我将myInfoFactory bean声明从applicationContext.xml移动到subContext.xml,它就不再抛出该异常了。不确定为什么它在applicationContext.xml中声明时是不可见的。由于我的环境,我不能永久地将bean移动到subContext.xml。 MyInfoFactory类
public class MyInfoFactory {
private Logger log;
@Autowired
private PortletRequest request;
...
public MyInfo getInstance(PortletRequest request) {
}
...
}
答案 0 :(得分:1)
问题不在于配置本身,而在于您尝试恢复该特定bean的位置。
如果您尝试从父应用程序上下文中定义的Bean中注入子ApplicationContext(subContext.xml)中定义的请求范围的bean,那么您赢得的侦听器(applicationContext.xml)将获得#bean能够“看到&#39;特别是。
这种关系在另一个方向起作用。孩子实际上可以看到父容器中定义的每一个。
一个解决方案可能是将您的请求代理移动到父代,因为它们是您可以执行此操作的代理。但是,如果在尝试使用该特定代码时没有可用请求,则会抛出运行时豆。