복붙노트

[SPRING] Spring MVC LocaleChangeInterceptor 어노테이션이 작동하지 않음

SPRING

Spring MVC LocaleChangeInterceptor 어노테이션이 작동하지 않음

import java.util.Locale;

import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping;

@Configuration
public class Config {
    @Bean
    public LocaleResolver localeResolver() {
        final CookieLocaleResolver ret = new CookieLocaleResolver();
        ret.setDefaultLocale(new Locale("en_US"));
        return ret;
    }

    @Bean
    public MessageSource messageSource() {
        final ReloadableResourceBundleMessageSource ret = new ReloadableResourceBundleMessageSource();
        ret.setBasename("classpath:lang");
        ret.setDefaultEncoding("UTF-8");
        return ret;
    }

    @Bean
    public HandlerMapping handlerMapping() {
        final LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
        interceptor.setParamName("language");

        final DefaultAnnotationHandlerMapping ret = new DefaultAnnotationHandlerMapping();
        ret.setInterceptors(new Object[] { interceptor });
        return ret;
    }
}

위의 내용이 주석 구성입니다. 기본적으로이 튜토리얼의 XML을 번역했다.

이상하게도 내가 갈 때 ... 작동하지 않는다 ...? language = fr.

그러나 다음은 app-servlet.xml에서 작동합니다 (여기서는 locale을 사용함).

<mvc:interceptors>
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <property name="paramName" value="locale" />
    </bean>
</mvc:interceptors>

주목할 또 다른 중요한 점은 위의 메서드에 중단 점을 넣을 때 그 중 세 개의 중단 점이 모두 중단된다는 것입니다. 이는 "누군가"가 값을 읽음을 의미합니다.

그렇다면 왜 내 주석 기반 인터셉터가 작동하지 않을까요?

해결법

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

    1.WebMvcConfigurerAdapter로 구성 클래스를 확장하면 도움이 될 수 있습니다. 인터셉터 엔트리 오버라이드를 추가하는 방법

    WebMvcConfigurerAdapter로 구성 클래스를 확장하면 도움이 될 수 있습니다. 인터셉터 엔트리 오버라이드를 추가하는 방법

    public void addInterceptors(InterceptorRegistry registry) {
       registry.addInterceptor(localeChangeInterceptor());
    } 
    

    방법. 또한 LocaleChangeInterceptor에 대한 빈 항목 추가

    @Bean 
    public LocaleChangeInterceptor localeChangeInterceptor(){
        LocaleChangeInterceptor localeChangeInterceptor=new LocaleChangeInterceptor();
        localeChangeInterceptor.setParamName("language");
        return localeChangeInterceptor;
    }
    
  2. ==============================

    2.스왑이 말하는 것 외에도 다음을 추가해야합니다.

    스왑이 말하는 것 외에도 다음을 추가해야합니다.

    @Bean(name = "localeResolver")
    public LocaleResolver getLocaleResolver(){
        return new CookieLocaleResolver();
    }
    

    빈 이름이 중요합니다. 스프링이 올바른 로케일 해석자를 해결하는 방법입니다.

    SessionLocaleResolver를 반환 할 수도 있습니다.

    추가하지 않으면 다음 오류가 발생합니다.

    Cannot change HTTP accept header - use a different locale resolution strategy
    
  3. ==============================

    3.Spring MVC 4.1.4.RELEASE 현지화의 전체 예제가 게시됩니다. 또한 MKYong의 예제를 사용할 수도 있지만 (불행히도 config는 XML을 기반으로합니다) 프로젝트 구조의 문제를 해결할 수 있습니다.

    Spring MVC 4.1.4.RELEASE 현지화의 전체 예제가 게시됩니다. 또한 MKYong의 예제를 사용할 수도 있지만 (불행히도 config는 XML을 기반으로합니다) 프로젝트 구조의 문제를 해결할 수 있습니다.

    package com.pizza.config;
    
    import org.springframework.context.MessageSource;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.support.ReloadableResourceBundleMessageSource;
    import org.springframework.web.servlet.LocaleResolver;
    import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    import org.springframework.web.servlet.i18n.CookieLocaleResolver;
    import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
    import org.springframework.web.servlet.view.InternalResourceViewResolver;
    import org.springframework.web.servlet.view.JstlView;
    
    @Configuration
    @EnableWebMvc
    @ComponentScan(value = "com.pizza")
    public class WebConfig extends WebMvcConfigurerAdapter {
    
        /* Resolvers and other MVC needs */
    
        @Bean
        public InternalResourceViewResolver getInternalResourceViewResolver() {
            InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    
            resolver.setViewClass(JstlView.class);
            resolver.setPrefix("/WEB-INF/views/");
            resolver.setSuffix(".jsp");
    
            return resolver;
        }
    
        @Override
        public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
            configurer.enable();
        }
    
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
        }
    
    
        /* Localization section is started */
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(localeChangeInterceptor());
        }
    
        @Bean
        public LocaleChangeInterceptor localeChangeInterceptor(){
            LocaleChangeInterceptor localeChangeInterceptor=new LocaleChangeInterceptor();
            localeChangeInterceptor.setParamName("language");
            return localeChangeInterceptor;
        }
    
        @Bean(name = "localeResolver")
        public LocaleResolver getLocaleResolver(){
            return new CookieLocaleResolver();
        }
    
        @Bean
        public MessageSource messageSource() {
            final ReloadableResourceBundleMessageSource ret = new ReloadableResourceBundleMessageSource();
            ret.setBasename("classpath:languages");
            ret.setDefaultEncoding("UTF-8");
            return ret;
        }
    
    }
    
  4. from https://stackoverflow.com/questions/11752710/spring-mvc-localechangeinterceptor-annotation-based-doesnt-work by cc-by-sa and MIT license