Перехватчик называется в 2 раза больше - PullRequest
0 голосов
/ 02 июля 2019

Я использую библиотеку Spring i18n.
- ReloadableResourceBundleMessageSource
- SessionLocaleResolver
- LocaleChangeInterceptor

Нет ошибок.Если я использую функцию сильного обновления в Chrome, все методы перехватчика выполняются в два раза больше.И проблема возникает только тогда, когда на страницах используется messages.properties.

preHandle ==> Controller ==> postHandle ==> AfterCompletion выполняется, и все методы выполняются в два раза больше.

Я посмотрел на жизненный цикл перехватчика, но не понимаю, почему перехватчик работает дважды без причины.


1. servlet-context.xml

<beans:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <beans:property name="basenames" value="/WEB-INF/messages/messages, /WEB-INF/messages/messages_ko_KR" />
</beans:bean>    
<beans:bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
    <beans:property name="defaultLocale" value="ko_KR" />
</beans:bean>
<interceptors>
    <beans:bean id="localeChangeInterceptor" class="com.test.util.locale.LocaleChangeInterceptor" />
</interceptors>


2. LocaleChangeInterceptor реализован мной и реализован так же просто, как и код ниже.

public class LocaleChangeInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {

        String language = request.getParameter("language");

        System.out.println("1. preHandle(): " + language);

        if(language != null) {
            LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
            localeResolver.setLocale(request, response, StringUtils.parseLocaleString(language));
        }

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("2. postHandle()");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("3. afterCompletion()");
    }
}


Консоль

1. preHandle(): null
main.jsp
2. postHandle()
3. afterCompletion()
1. preHandle(): null
2. postHandle()
3. afterCompletion()
1. preHandle(): null
2. postHandle()
3. afterCompletion()

Я не знаю, является ли это проблемой или естественным результатом жизненного цикла Перехватчика.

1 Ответ

0 голосов
/ 03 июля 2019

Решено. Это было решено первым созданием компонента-перехватчика, затем путем вызова зарегистрированного компонента по ссылке из.

Кажется, это проблема, потому что я плохо знал о регистрации Spring-перехватчиков. Мне нужно узнать больше.

<beans:bean id="localeChangeInterceptor" class="com.test.util.locale.LocaleChangeInterceptor" />

<interceptors>
    <interceptor>
        <mapping path="/**" />
        <exclude-mapping path="/resources/**" />
        <beans:ref bean="localeChangeInterceptor" />
    </interceptor>
</interceptors>
...