복붙노트

[SPRING] Spring 컨텍스트가 두 번로드되는 이유는 무엇입니까?

SPRING

Spring 컨텍스트가 두 번로드되는 이유는 무엇입니까?

봄과 봄 보안 웹 프로젝트가 있습니다. 내 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>

서버 로그에서 스프링 컨텍스트가 두 번로드되는 것을 봅니다 (스프링 bean 초기화, 데이터베이스 생성 ...). 처음에는 DispatcherServlet이이를 수행하고 ContextLoaderListener는 secont 시간에 수행합니다. 어떻게 해결할 수 있습니까?

이 튜토리얼에서는 contextParam이 제공되면 서블릿 init-params가 필요 없다는 것을 알 수 있습니다. 하지만 init params를 제거하면 다음과 같은 오류가 발생합니다. "org.apache.catalina.LifecycleException : org.apache.catalina.LifecycleException : java.io.FileNotFoundException : ServletContext 자원 [/WEB-INF/billboard-servlet.xml]을 열 수 없습니다. ". Dispather 서블릿은 기본 위치에서 컨텍스트 구성을 찾습니다.

해결법

  1. ==============================

    1.여전히 서블릿에 대한 컨텍스트가 필요합니다.

    여전히 서블릿에 대한 컨텍스트가 필요합니다.

    ContextLoaderListener에서 context-param으로로드 할 필요는 없습니다.

    security-config.xml을 context-param (보안은 애플리케이션마다 전역 적이어야 함)으로두고 billboard-servlet.xml을 서블릿의 contextConfigLocation으로 사용해야하며 작동해야합니다.

  2. ==============================

    2.나는 같은 문제가 있었고 그 이유는 다음과 같았다.

    나는 같은 문제가 있었고 그 이유는 다음과 같았다.

    1

  3. ==============================

    3.이것들은 같은 일을하는 두 개의 독립적 인 방법입니다. 예를 들어 ContextLoaderListener를 삭제합니다.

    이것들은 같은 일을하는 두 개의 독립적 인 방법입니다. 예를 들어 ContextLoaderListener를 삭제합니다.

  4. ==============================

    4.Spring delegatingFilterProxy가 있으므로 contextLoaderLister를 삭제하면 아래 예외가 발생합니다.

    Spring delegatingFilterProxy가 있으므로 contextLoaderLister를 삭제하면 아래 예외가 발생합니다.

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

    따라서 dispatcher 서블릿을 통해 contextLoaderLister 및 billboard-servlet.xml을 통해 security-config.xml을로드하십시오.

  5. from https://stackoverflow.com/questions/11409237/why-spring-context-is-loaded-twice by cc-by-sa and MIT license