[SPRING] Spring MVC LocaleChangeInterceptor 어노테이션이 작동하지 않음
SPRINGSpring 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.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.스왑이 말하는 것 외에도 다음을 추가해야합니다.
스왑이 말하는 것 외에도 다음을 추가해야합니다.
@Bean(name = "localeResolver") public LocaleResolver getLocaleResolver(){ return new CookieLocaleResolver(); }
빈 이름이 중요합니다. 스프링이 올바른 로케일 해석자를 해결하는 방법입니다.
SessionLocaleResolver를 반환 할 수도 있습니다.
추가하지 않으면 다음 오류가 발생합니다.
Cannot change HTTP accept header - use a different locale resolution strategy
-
==============================
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; } }
from https://stackoverflow.com/questions/11752710/spring-mvc-localechangeinterceptor-annotation-based-doesnt-work by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] HibernateException : 현재 스레드에 대해 트랜잭션 동기화 세션을 가져올 수 없습니다. (0) | 2019.04.05 |
---|---|
[SPRING] 봄 부팅 다중 로그 파일 (0) | 2019.04.05 |
[SPRING] Spring RestTemplate 클라이언트 - 연결이 거부 된 예외 (0) | 2019.04.05 |
[SPRING] Spring 빈을 ExecutorService의 ThreadLocal 인스턴스처럼 동작하게 만들기 (0) | 2019.04.05 |
[SPRING] 하나의 web.xml에 다중 저지 서블릿 (0) | 2019.04.05 |