복붙노트

[SPRING] setBundle을 사용해로드 된 프로퍼티 파일의 재로드

SPRING

setBundle을 사용해로드 된 프로퍼티 파일의 재로드

나는 봄에 속성 파일을 포함하고있는 문제에 대해 약간의 도움을 원했다. 그래서 내가 가지고있는 셋업은 이렇습니다 :

opto-mapping.properties - 내 src 폴더에 있으며 다음과 같이 최적화 된 리소스에 대한 번역이 포함되어 있습니다.

generic-min.css=4037119659.css

이 특성 파일은 빌드 'optimize'가 실행될 때마다 갱신됩니다. 나는 그 때 사용한다.

<fmt:setBundle basename="opto-mapping" />

내 jsp에서 내 등록 정보 파일을 가져 오려면. 그런 다음 다음을 사용하여 내용을 참조하십시오.

<fmt:message key='generic-min.css' />

이 모든 것은 아름답게 작동합니다. 단, 등록 정보 파일을 다시로드하려면 tomcat 재시작이 필요합니다. 리소스가 업데이트 될 때마다 사이트를 다운시켜야 할 필요가 없습니다. 속성 파일이 자동으로 너무 자주 새로 고침되기를 바랍니다.

spring-context.xml에있는 기존 빈을 업데이트하여이 속성 파일을 다시로드하려고 시도했지만 번역과는 달리이 작업은 효과가 없습니다 - opto-mapping.properties 파일 위치 때문에 가능성이 높습니다 -하지만 필요한 것을 볼 수 있습니다 fmt : setBundle을 사용하여로드 할 해당 위치에 있어야합니다.

<bean id="messageSource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="cacheSeconds">
            <value>1</value>
        </property>
        <property name="basenames">
            <list>
                <value>WEB-INF/translations/translations</value>
                <value>WEB-INF/classes/opto-mapping</value>
            </list>
        </property>
</bean>

이 어려운시기에 어떤 도움이나 올바른 방향으로 한 점을 높이 평가할 수 있습니다.

이 모든 것들이 선생님들과 많은 감사를드립니다.

지.

해결법

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

    1.시도 할 몇 가지 사항이 있습니다.

    시도 할 몇 가지 사항이 있습니다.

    은 결국 ResourceBundle.getBundle (String, Locale, ClassLoader)를 호출합니다. 여기서 문자열은 기본 이름이 될 것이고 클래스 로더는 Thread.currentThread (). getContextClassLoader ()가 될 것입니다. JDK 1.6을 사용하는 경우 ResourceBundle.clearCache (ClassLoader)를 사용하여 번들 캐시를 지울 수 있습니다. 서블릿 필터에서이를 수행하고 다른 논리와 결합하여 캐시를 지우는시기를 결정하는 것이 좋습니다.

    또 다른 각도는 JSTL의 등록 정보 파일로드 및 구성을 직접 제어하는 ​​것입니다. 다시 필터를 사용합니다 (예외 처리 무시).

    ClassLoader ctxLoader = Thread.currentThread().getContextClassLoader();
    URL propsURL = ctxLoader.getResource("opto-mapping.properties");
    URLConnection propsConn = propsURL.openConnection();
    long propsLastModified = propsConn.getLastModified();
    // decide if you want to reload...
    propsConn.setUseCaches(false);
    InputStream propsIn = propsConn.getInputStream();
    ResourceBundle propsBundle = new PropertyResourceBundle(propsIn);
    propsIn.close();
    LocalizationContext propsCtx = new LocalizationContext(propsBundle);
    ServletContext servletCtx = this.filterConfig.getServletContext();
    Config.set(servletCtx, Config.FMT_LOCALIZATION_CONTEXT, propsCtx);
    

    그러면 페이지에서 를 사용할 수 있습니다. JSTL API에서 LocalizationContext 및 Config에 대한 문서를 찾을 수 있습니다.

    JDK 1.6에 추가 된 ResourceBundle (ResourceBundle.Control 포함)을 새로 살펴보고 URLConnection과 같은 "하위 수준"API의 기능을 명심하고 더 많은 정보를 얻으십시오. API를 통해 사용할 수있는 JSTL의 프로그래밍 측면

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

    2.답변 해 주셔서 감사합니다. 나는 이제이 일을하고 부자를 나눌 것이라고 생각했습니다.

    답변 해 주셔서 감사합니다. 나는 이제이 일을하고 부자를 나눌 것이라고 생각했습니다.

    그래서, src 폴더에서 WEB-INF / properties로 속성 파일을 옮겼습니다.

    등록 정보 파일을로드하기 위해 다음 bean을 업데이트했습니다.

    <bean id="messageSource"
            class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
            <property name="cacheSeconds">
                <value>1</value>
            </property>
            <property name="basenames">
                <list>
                    <value>WEB-INF/translations/translations</value>
                    <value>WEB-INF/properties/opto-mapping</value>
                </list>
            </property>
        </bean>
    

    이제는 이전에 setBundle을 사용하여 다음과 같은 속성 파일을로드했습니다.

    <fmt:setBundle basename="opto-mapping" />
    

    하지만 필자가 이동했기 때문에 속성 파일이 더 이상로드되지 않는 것을 발견했습니다. 그러나 빈 설정으로 인해 새 특성 파일이로드되고 있지만 setBundle이이를 덮어 쓰고있었습니다.

    그래서 솔루션은 setBundle을 제거하고 이제는 내 등록 정보 파일을 다시로드하는 것입니다!

    다시 한 번 감사드립니다!

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

    3.Tomcat은 클래스 경로에있는 자원을 다시로드하지 않습니다. 이것은 ReloadableResourceBundleMessageSource에 대한 javadoc에 명시되어 있습니다.

    Tomcat은 클래스 경로에있는 자원을 다시로드하지 않습니다. 이것은 ReloadableResourceBundleMessageSource에 대한 javadoc에 명시되어 있습니다.

    이러한 클래스 경로 위치에는 WEB-INF / classes가 포함되며 릴리스되지 않습니다.

    opto-mapping.properties를 다른 위치 (예 : WEB-INF / messages)로 이동 한 다음 시도해보십시오.

  4. from https://stackoverflow.com/questions/4136403/reloading-of-properties-file-which-is-loaded-using-setbundle by cc-by-sa and MIT license