Spring Java 配置中的 Mvc 消息包

Spring Mvc Message Bundle in Java configuration

我用的是spring5.1.5。我使用 Java 配置,但消息包不起作用。

  1. 当我在 xml 中编写它时,一旦将配置转移到 Java,一切都会正常工作,消息 No message found under code 'jsp.header.entry' for locale 'ru'出现了
  2. 在 xml 配置中我可以设置 fileEncodings("UTF-8") 但在 Java 配置中我不知道如何设置

一个很大的帮助请求。谢谢。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="/WEB-INF/locales/message"/>
        <property name="useCodeAsDefaultMessage" value="false"/>
        <property name="fileEncodings" value="UTF-8"/>
        <property name="defaultEncoding" value="UTF-8"/>
        <property name="cacheSeconds" value="-1"/>
    </bean>

    <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <property name="paramName" value="lang"/>
    </bean>

    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
        <property name="defaultLocale" value="ru"/>
    </bean>
</beans>

变成了

@Configuration
@EnableWebMvc
@ComponentScan({"com.seeds.controllers", "com.seeds.validators"})
public class WebConfig implements WebMvcConfigurer {

    //Message Source config
    @Bean
    public ReloadableResourceBundleMessageSource getMessageSource(){
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();

        messageSource.setBasename("/WEB-INF/locales/message");
        messageSource.setUseCodeAsDefaultMessage(false);
        messageSource.setDefaultEncoding("UTF-8");
        messageSource.setCacheSeconds(-1);
        return messageSource;
    }

    @Bean
    public LocaleChangeInterceptor getLocaleChangeInterceptor(){
        LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();

        localeChangeInterceptor.setParamName("lang");
        return localeChangeInterceptor;
    }

    @Bean
    public SessionLocaleResolver getLocaleResolver(){
        SessionLocaleResolver localeResolver = new SessionLocaleResolver();

        localeResolver.setDefaultLocale(new Locale("ru"));
        return localeResolver;
    }

//others

您仍然可以在 Java 配置中设置文件编码。

messageSource.setFileEncodings(new Properties() {{ put("YourFileName.ru", "your-encoding"); }});

如果在 fileEncodings 字段中未找到特定编码,则使用 defaultEncoding。 由于您没有为文件使用特定编码,因此使用默认 "UTF-8" 编码。

您的 Java 配置在编码方面很好。但是您实现了 WebMvcConfigurer,因此您需要覆盖 addInterceptors 方法,因为您的 LocaleChangeInterceptor 将被添加到 InterceptorRegistry。请尝试:

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
    localeChangeInterceptor.setParamName("lang");
    registry.addInterceptor(localeChangeInterceptor);
  }

MessageSourceLocaleResolver 都按名称查找,分别是 messageSourcelocaleResolver

使用基于 Java 的配置时 the name of the method is used as the name of the bean。正如您将它们命名为 getMessageSourcegetLocaleResolver 所需的 beans 未找到并因此被忽略。

要修复,请将名称分别更改为 messageSourcelocaleResolver

@Configuration
@EnableWebMvc
@ComponentScan({"com.seeds.controllers", "com.seeds.validators"})
public class WebConfig implements WebMvcConfigurer {

    //Message Source config
    @Bean
    public ReloadableResourceBundleMessageSource messageSource(){

        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("/WEB-INF/locales/message");
        messageSource.setUseCodeAsDefaultMessage(false);
        messageSource.setDefaultEncoding("UTF-8");
        messageSource.setCacheSeconds(-1);
        return messageSource;
    }

    @Bean
    public SessionLocaleResolver localeResolver(){

        SessionLocaleResolver localeResolver = new SessionLocaleResolver();
        localeResolver.setDefaultLocale(new Locale("ru"));
        return localeResolver;
    }