6

我有带有 Spring 和 Spring 安全性的 web 项目。我的 web.xml:

    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0" >
        <display-name>BillBoard
        </display-name>
        <session-config>
            <session-timeout>
                30
            </session-timeout>
        </session-config>
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        <listener>
            <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
        </listener>
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:security-config.xml classpath:billboard-servlet.xml</param-value>
        </context-param>
        <servlet>
            <servlet-name>billboard</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:security-config.xml classpath:billboard-servlet.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>

        </servlet>
        <servlet-mapping>
            <servlet-name>billboard</servlet-name>
            <url-pattern>*.html</url-pattern>
        </servlet-mapping>
        <filter>
            <filter-name>springSecurityFilterChain</filter-name>
            <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
        </filter>

        <filter-mapping>
            <filter-name>springSecurityFilterChain</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    </web-app>

在服务器日志中,我看到 Spring 上下文被加载了两次(spring bean 初始化、数据库创建......)。第一次是 DispatcherServlet,第二次是 ContextLoaderListener。我该如何解决?

教程中,我看到如果提供了 contextParam,则不需要 servlet init-params。但是如果我删除初始化参数我有错误:“org.apache.catalina.LifecycleException: org.apache.catalina.LifecycleException: java.io.FileNotFoundException: 无法打开 ServletContext 资源 [/WEB-INF/billboard-servlet.xml] ”。Dispather servlet 在默认位置找到上下文配置。

4

5 回答 5

6

您仍然需要 servlet 的上下文:

在初始化 DispatcherServlet 时,Spring MVC 在您的 Web 应用程序的 WEB-INF 目录中查找名为 [servlet-name]-servlet.xml 的文件并创建在那里定义的 bean,覆盖任何同名定义的 bean 的定义在全球范围内。

您不需要像context-param在其中那样加载它ContextLoaderListener

只需保留security-config.xmlas context-param(它必须去那里,因为每个应用程序的安全性是全局的),并且billboard-servlet.xml作为contextConfigLocation您的 servlet 并且它应该可以工作。

于 2012-07-10T08:56:54.643 回答
3

我有同样的问题,原因是:

<load-on-startup>1</load-on-startup

于 2016-03-31T13:25:30.297 回答
2

这是做同一件事的两种独立方法。ContextLoaderListener例如,删除。

于 2012-07-10T08:18:51.877 回答
1

既然你有 spring delegatingFilterProxy,如果你放弃,contextLoaderLister你会得到以下异常。

java.lang.IllegalStateException: No WebApplicationContext found: 
no   ContextLoaderListener registered?

因此,通过 contextLoaderLister 加载 security-config.xml,通过调度程序 servlet 加载 billboard-servlet.xml。

于 2017-02-02T13:30:40.060 回答
0

当您在 XML 中配置 spring MVC 框架配置时,您可以配置如下:

<!-- for Spring context loader -->
<servlet>
    <servlet-name>billboard</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:security-config.xml classpath:billboard-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>

</servlet>

此配置将导致 IoC 容器初始化两次。

您应该将默认的 servlet 名称[billboard] 更改为其他来解决此问题。

因为您的调度程序 servlet 使用默认的上下文命名空间 [name of servlet]-servlet.xml(在这种情况下为 billboard-servlet.xml),所以 Spring MVC 将自动加载它。

更多详情见:https ://www.conqtech.com/blog/?p=85

于 2019-06-19T20:36:51.343 回答