복붙노트

[SPRING] Spring MVC : 귀속 컨텍스트 공유

SPRING

Spring MVC : 귀속 컨텍스트 공유

일반적인 물건을 가진 항아리와 일반적인 항아리를 사용하려는 두 가지 전쟁 웹 응용 프로그램이 들어있는 귀 포장이 있습니다. DispatcherServlet에 ContextLoaderListener 및 webapp 컨텍스트를 개별적으로 사용하도록 구성을 설정했습니다.

내 데모 앱의 설정은 대략 다음과 같습니다

applicationContext

<beans>
    <!-- namespace etc declarations omitted -->
    <context:annotation-config />
    <context:component-scan base-package="study.spring.multicontext.shared" />
</beans>

beanRefContext.xml

<beans>
    <!-- namespace etc declarations omitted -->
<bean id="sharedContext" class="org.springframework.context.support.ClassPathXmlApplicationContext">
    <constructor-arg>
        <list>
            <value>classpath*:applicationContext.xml</value>
        </list>
    </constructor-arg>
</bean>
</beans>

xx-servlet.xml은 webapp 특정 컨텍스트와 같습니다. 웹 네임 스페이스는 컨트롤러가있는 곳입니다.

<beans>
    <!-- namespace etc declarations omitted -->

    <context:component-scan base-package="study.spring.multicontext.web"/>
    <mvc:annotation-driven />

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

      <property name="suffix" value=".jsp"/>
    </bean>

</beans>

문제는 여전히 두 개의 빈 인스턴스가 있다는 것입니다. 각 컨트롤러 / 웹 앱마다 하나씩, 각 전쟁마다 단 하나의 컨트롤러가 있기 때문입니다. 내가 구성을 왜곡하려고 노력했지만, 내가 무엇을하더라도, 나는 0 인스턴스 또는 2 인스턴스를 얻는다.

메모리 덤프에서 이클립스 MAT를 사용하여 레퍼런스를 확인했는데 실제로 4 개의 인스턴스가 있지만 두 개는 스프링 내부 용으로 사용된다고 생각한다. 어쨌든, 거기에서 그것은 각 컨트롤러가 자신의 인스턴스를 가지고 있다는 것을 분명히 볼 수 있습니다.

나는 블로그 포스트, 토론 포럼 등을 많이 읽었는데, 그들이 이렇게 간단해야한다고 말한다. 일부는 JNDI를 제안하지만, 이해했듯이 이것은 JNDI없이 가능해야합니다.

전쟁을 결합하고 병을 내부에 묶는 것은 불가능합니다. 이 데모 응용 프로그램에서 작동 할 수 있으므로 실제로 사용하고있는 실제 사례는이를 허용하지 않습니다.

이 문제에 대한 도움은 매우 감사하겠습니다. 미리 감사드립니다.

스프링 2.X에 대한 2007의 SpringSource 예제는 동일하지만 구성이 다릅니다. 현상금 설명에서 dscribed 된 약간 구형이며 Spring 3.X 기반 솔루션을 찾고 있습니다.

해결법

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

    1.나는 애플리케이션 컨텍스트 계층 구조에 관한 한 스프링 2.x에서 3.x로 변경된 사항이 없다고 생각한다.

    나는 애플리케이션 컨텍스트 계층 구조에 관한 한 스프링 2.x에서 3.x로 변경된 사항이 없다고 생각한다.

    내가 말할 수있는 것부터, config의 문제는 applicationContext.xml을로드하고 있다는 것입니다. 이는 sharedContext에로드 된 applicationContext.xml도 컨텍스트에서 언급 한 사실 때문에 각 webapp에 의해로드됩니다. param contextConfigLocation.

    동일한 파일이 두 번로드되기 때문에 부모 컨텍스트에서 한 번, 웹 응용 프로그램의 루트 컨텍스트에서 한 번 복사됩니다. 하위 컨텍스트 즉, webapp는 생성 된 것을 사용하고 부모에있는 것을 사용하지 않습니다.

    같은 콩 xml을 두 번 다시로드하지 않도록 설정을 변경하면 잘 작동합니다. parentContextKey를 사용할 수 있고 contextConfigLocation은 둘 다 동일한 파일을로드하지 않습니다.

    최신 정보: 위와 더불어 공유 항아리가 전쟁에 표시되는지 확인해야합니다 (동일한 인스턴스를 공유 할 수있는 것처럼 표시됨). 블로그에서 샘플을 실행하려고 시도했지만 Java EE6 응용 프로그램으로 배포했을 때 제대로 작동하지 않았습니다. 이는 전쟁에서 ear jar 가시성에 대한 규칙이 Java EE5에서 EE6으로 변경 되었기 때문입니다. Glass Fish의 호환 모드로 샘플을 실행하면 모든 것이 예상대로 작동합니다.

    따라서 실행중인 Servlet 스펙을 확인하려면 EAR / WAR를 점검하고 서버가 이에 맞게 애플리케이션을 전개하는지 확인하십시오.

    Java EE 6으로 업그레이드해야하는 경우 http://docs.oracle.com/cd/E19226-01/820-7688/gjjdt/index.html의 최신 표시 규칙을 따르고 있는지 확인하십시오. 전쟁의 MANIFEST 파일을 점검하여 클래스 경로 구성에서 명시 적으로 언급 된 모든 귀고리가 있는지 확인하십시오.

    희망이 도움이됩니다.

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

    2.나는 해결했다.

    나는 해결했다.

    문제는 클래스 로딩에서 @ Akshay의 대답에 대한 코멘트에서 의심 스러웠습니다.

    Maven에는 각 war 패키지 안에 spring 라이브러리가 포함되어있어 여러 번로드되었습니다. 이 문제를 해결하려면 마른 전쟁을 일으켜야합니다.

    web.xml의 context-params에서 contextConfigLocation을 제거하는 그의 대답에 대한 Akshay의 메모가 핵심 역할에 있다고 가정합니다.

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

    3.우리에게는 비슷한 문제가있었습니다. 실험을 위해 생성 한 간단한 maven 예제 (2 개의 WEB 모듈을 가진 EAR과 부모 스프링 컨텍스트 서비스 모듈을 통해 공유 됨)를 확인하십시오 : 전쟁 사이에 스프링 컨텍스트를 공유하는 EAR

    우리에게는 비슷한 문제가있었습니다. 실험을 위해 생성 한 간단한 maven 예제 (2 개의 WEB 모듈을 가진 EAR과 부모 스프링 컨텍스트 서비스 모듈을 통해 공유 됨)를 확인하십시오 : 전쟁 사이에 스프링 컨텍스트를 공유하는 EAR

  4. from https://stackoverflow.com/questions/16162877/spring-mvc-sharing-context-within-ear by cc-by-sa and MIT license