2017-07-08 46 views
0

我在写一个使用Spring Boot的应用程序。在我的应用程序中,我将使用本地化的网址,例如http://localhost:8080/School/**en**/xxx/...。我尝试实现Custom Locale Interceptor。在下面列出的第一个变种工作正常。我想使用第二个变体,而不是法国或德国的区域设置不会改变,仍然是en_US。任何人都可以给我建议吗?创建自定义LocalChangeInterceptor

@Configuration 
public class WebConfiguration extends WebMvcConfigurerAdapter { 

1 VARIANT 

@Bean 
public LocaleResolver localeResolver() { 
    SessionLocaleResolver slr = new SessionLocaleResolver(); 
    slr.setDefaultLocale(Locale.GERMANY); 
    return slr; 
} 

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

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

2 VARIANT 

@Bean 
public LangInterceptor langInterceptor() { 
    return new LangInterceptor(); 
} 

    @Override 
public void addInterceptors(InterceptorRegistry registry) { 
    registry.addInterceptor(langInterceptor()); 
} 

@Bean 
public SessionLocaleResolver sessionLocaleResolver() { 
    SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver(); 
    sessionLocaleResolver.setDefaultLocale(Locale.GERMANY); 
    return sessionLocaleResolver; 
} 
} 

而且我的自定义拦截器:

public class LangInterceptor extends HandlerInterceptorAdapter { 

@Autowired 
LocaleResolver sessionLocaleResolver; 
Locale locale; 

@Override 
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
    if (StringUtils.startsWithIgnoreCase(request.getServletPath(), "/it/")) { 
     locale = new Locale("it"); 
    } else { 
     locale = new Locale("en"); 
    } 
    sessionLocaleResolver.setLocale(request, response, Locale.FRENCH); 
    return true; 
} 

@Override 
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 

} 

@Override 
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 

} 
} 
+0

我的回答对您有帮助吗? –

+0

非常感谢,你的解释是完全真实的,但是: 1. LocaleChangeInterceptor来自'org.springframework.web.servlet.i18n'包,可以使用,它可以作为所有的第一个变体。 2.第二个变体用xml编写时适用于我。 –

+0

我需要的确切是我的语言环境将从url –

回答

0

我找到了解决方案。如果我只是在我的配置文件LocaleChangeInterceptor中添加,第一个变体将起作用。原因看起来像LocaleResolver没有拦截器没有初始化,但春天文档说,每个类都有默认的构造函数。所以它工作。

@Bean 
    public LocaleChangeInterceptor localeChangeInterceptor() { 
    LocaleChangeInterceptor lci = new LocaleChangeInterceptor(); 
    lci.setParamName("lang"); 
    return lci; 
} 
0

你不能在随机HandlerInterceptorAdapter扔更改地区。 Spring默认使用AcceptHeaderLocaleResolver,并且您想根据路径段进行解析。扩展WebMvcConfigurerAdapter,然后执行以下操作:

@Bean 
public LocaleResolver localeResolver() { 
    // return custom LocaleResolver 
} 

但是,我警告你,你打算对HTTP规范。 Accept-Language标题是为了这个目的,这是AcceptHeaderLocaleResolver使用的。

您不需要LocaleChangeInterceptor,因为它对查询参数进行操作。