在我的springmvc应用程序中,我正在root-context.xml中创建一个bean
<bean class="com.app.commons.utilities.AppInfoHelper"
init-method="setApplicationInfo" lazy-init="false">
</bean>
在appinfohelper.java中我想使用 ServletContext
为了一些商业逻辑,所以我用 @Autowired
在该类中:
public final class AppInfoHelper
{
public static ApplicationInfo appInfo=null;
private AppInfoHelper() {}
@Autowired
ServletContext servletContext;
public void setApplicationInfo()
{
if(servletContext.getAttribute("appNOTRegistered") != null)
{
//some logic here
}
}
}
作为 setApplicationInfo
是bean的init方法,所以当我检查 servletContext
在方法中它总是空的。我查过了 component-scan
正确设置为 <context:component-scan base-package="com.app.*" />
也 <annotation-driven />
也是它们在servlet-context.xml文件中的名称。
我做错了什么?
我的web.xml如下:
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2条答案
按热度按时间b09cbbtk1#
ServletContext
不是Springbean,因此,除非实现ServletContextAware
.aemubtdh2#
在寻找原因的同时,我意识到了一个小错误,于是找到了解决办法。
就像我说的,我正在创建类bean
AppInfoHelper
在root-context.xml中ContextLoaderListener
,它创建根应用程序上下文。根据词根和上下文:根上下文无法访问子上下文bean
在这里,
ServletContext
创建人DispatcherServlet
它是一个子上下文,因此在根上下文中创建的bean不能(直接)访问它。解决方案:
我从root-context.xml中删除了以下bean创建,并将其添加到servlet-context.xml中。
通过这种改变,
ServletContext
在bean中自动连接。裁判:https://howtodoinjava.com/spring-mvc/contextloaderlistener-vs-dispatcherservlet/