为什么spring-vaadin会忘记我的设置区域设置,但在页面刷新后会突然记住它?

情况:我有一个vaadin-
spring应用程序,我必须让用户在登录时更改语言.我在登录页面使用一个组合框来切换区域设置.
Spring语言环境解析器实现是CookieLocaleResolver,因为我想在cookie中存储下次访问的选定选项.

@Bean
public LocaleResolver localeResolver() {
    CookieLocaleResolver localeResolver = new CookieLocaleResolver();
    localeResolver.setDefaultLocale(new Locale("de", "DE"));
    localeResolver.setCookieName("locale");
    localeResolver.setCookieMaxAge( 60 * 60 * 24 * 31);
    return localeResolver;
}

视图:

@SpringView(name = "login")
public class LoginView implements View {
    @Autowired
    private HttpServletRequest request;

    @Autowired
    private HttpServletResponse response;

    @Autowired
    private LocaleResolver localeResolver;

    ComboBox<LanguageOption> languageField;
    // ...
    languageField.addValueChangeListener(option -> {
        localeResolver.setLocale(request, response, option.getValue().getLocale());
    });
    // ...
}

更改组合框将名为locale的cookie设置为所需的语言区域设置(例如de_DE).语言环境解析器中的默认语言是de_DE.在登录时,我可以在两个选项之间切换:de_DE和en_US.

vaadin视图中的标题和文本转换由spring messageSource完成:

someCompoenent.setCaption(messageSource.getMessage("someComponent.caption", args, LocaleContextHolder.getLocale()));

在Vaadin UI中,我调用以下内容在会话和UI上设置区域设置:

public class MyUI extends UI implements ViewDisplay, ViewAccessControl {
    @Autowired
    private HttpServletRequest httpServletRequest;

    // ...
    @Override
    protected void init(VaadinRequest request) {
        // ...
        Locale currentLocale = localeResolver.resolveLocale(httpServletRequest);
        LocaleContextHolder.setLocale(currentLocale);

        setLocale(currentLocale);
        VaadinSession.getCurrent().setLocale(currentLocale);

        // ...
    }

}

我的问题是:当我在登录页面上的语言组合框中选择de_DE语言环境并登录时,LocaleContextHolder.getLocale()返回en_US,UI是英文的.但是,如果我在浏览器上点击F5并刷新页面,则UI将变为de_DE.

为什么?

注意:我注意到在登录之前和登录后,JSESSONID cookie发生了变化.我不知道在区域设置cookie存在时解析语言环境是否重要,并且在登录之前和之后它是相同的.

最佳答案 问题是过滤器链中有一个RequestContextFilter,它会覆盖localeResolver解析的语言环境,并在每个请求中使用默认值.

快速解决方案是在消息服务中手动解析区域设置:

Locale locale = localeResolver.resolveLocale(SpringVaadinServletRequest.getCurrent());

并使用此语言环境进行翻译.

点赞