AutowiredServletContext在xml定义的bean中为空

ukqbszuj  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(287)

在我的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>
b09cbbtk

b09cbbtk1#

ServletContext 不是Springbean,因此,除非实现 ServletContextAware .

@Controller
public class ServicesImpl implements Services, ServletContextAware{

@Autowired
private ServletContext context;

public void setServletContext(ServletContext servletContext) {
     this.context = servletContext;
}
aemubtdh

aemubtdh2#

在寻找原因的同时,我意识到了一个小错误,于是找到了解决办法。
就像我说的,我正在创建类bean AppInfoHelper 在root-context.xml中 ContextLoaderListener ,它创建根应用程序上下文。根据词根和上下文:
根上下文无法访问子上下文bean
在这里, ServletContext 创建人 DispatcherServlet 它是一个子上下文,因此在根上下文中创建的bean不能(直接)访问它。
解决方案:
我从root-context.xml中删除了以下bean创建,并将其添加到servlet-context.xml中。

<bean class="com.app.commons.utilities.AppInfoHelper"
        init-method="setApplicationInfo" lazy-init="false">         
</bean>

通过这种改变, ServletContext 在bean中自动连接。
裁判:https://howtodoinjava.com/spring-mvc/contextloaderlistener-vs-dispatcherservlet/

相关问题