SpringMVC的国际化

SpringMVC的国际化

WebMVC的核心LocaleResolver,MessageSource。

WebMvcAutoConfiguration 是SpringBoot中的 Web方面的自动配置类。

在MVC的配置类里面,如果没有自定义的LocaleResolver,那么就会使用默认的。并且自定义的名称是"localeResolver",才不会加载默认的。

默认使用的是AcceptHeaderLocaleResolver,这个类会从请求头里面获取Locale,如果没有,就使用默认的。

java 复制代码
@Override
@Bean
@ConditionalOnMissingBean(name = DispatcherServlet.LOCALE_RESOLVER_BEAN_NAME)
public LocaleResolver localeResolver() {
    if (this.webProperties.getLocaleResolver() == WebProperties.LocaleResolver.FIXED) {
        return new FixedLocaleResolver(this.webProperties.getLocale());
    }
    AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
    localeResolver.setDefaultLocale(this.webProperties.getLocale());
    return localeResolver;
}

@ConfigurationProperties("spring.web")
public class WebProperties {
    private Locale locale;

    private LocaleResolver localeResolver = LocaleResolver.ACCEPT_HEADER;

    private final Resources resources = new Resources();
}
  1. 默认的LocaleResolver

    不需要更改,需要在请求头里面添加的Accept-Language属性。

  2. 自定义的LocaleResolver

    需要从自定义的报文里面获取对应属性,就需要自定义LocaleResolver,获取报文属性里面的特定字段。

自定义实现国际化

  1. 自定义的LocaleResolver、MessageSource、Validator添加国际化功能
java 复制代码
@Configuration
public class LocaleWebMvcConfigurer implements WebMvcConfigurer {

    @Value("${spring.messages.basename:[]}")
    private String[] basename;

    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource =
                new ReloadableResourceBundleMessageSource();
        List<String> baseNames = new ArrayList<>();
        baseNames.add("classpath:i18n/validation/messages");
        Optional.ofNullable(basename).ifPresent(path -> {
            baseNames.addAll(Arrays.asList(path));
        });
        messageSource.setBasenames(baseNames.toArray(new String[0]));
        messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());
        return messageSource;
    }

    @Override
    public Validator getValidator() {
        return validator();
    }

    @Bean
    public Validator validator() {
        LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
        validator.setValidationMessageSource(messageSource());
        return validator;
    }

    @Bean
    public LocaleResolver localeResolver() {
        return new CustomLocaleResolver();
    }

    private static class CustomLocaleResolver implements LocaleResolver {
        @Override
        public Locale resolveLocale(HttpServletRequest request) {
            String[] locales = Optional.ofNullable((String) FlowRuntimeContext.getTechProperty("LOCALE")).orElse(Locale.getDefault().toString()).split("_");
            return new Locale(locales[0], locales[1]);
        }

        @Override
        public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
        }
    }
}
  1. 指定类路径下添加语言包message.properties,message_zh_CN.properties,message_en_US.properties,message_zh_TW.properties

  2. 使用MessageSource获取对应的message

    messageSource.getMessage(String code, @Nullable Object\[\] args, Locale locale);

相关推荐
CodeStats10 小时前
【Spring事务】Spring事务注解 @Transactional 完整体系:从 MySQL 隔离级别到 MyBatis 原理详解
java·spring·mybatis·事务·transactional
憧憬成为java架构高手的小白17 小时前
黑马八股--spring框架学习
java·学习·spring
Nuanyt21 小时前
SSM 学习记录 第二部分 Spring整合Mybatis&Junit AOP核心概念 Spring事务管理 SpringMVC 请求与响应 Rest风格
java·spring·junit·mybatis·restful
米码收割机1 天前
【SSM】Spring MVC_MyBatis SSM商城系统(源码+论文)【独一无二】
spring·mvc·mybatis
用户3126874877201 天前
@Autowired 注入的是代理对象?Spring AOP 代理选择原理一次讲透
java·spring
小罗水1 天前
第3章 从单体项目到 Spring Cloud 微服务
spring·spring cloud·微服务
Bug收容所1 天前
12305项目学习day5
java·spring boot·redis·mysql·spring·rocketmq
lichuangcsdn1 天前
【Spring AI 学习(三)】实现简单的对话
java·人工智能·学习·spring·spring ai
长不胖的路人甲1 天前
Spring Bean 完整生命周期
java·spring·rpc
辰海Coding1 天前
MiniSpring框架学习笔记-拦截器 :如何在方法前后进行拦截?
java·笔记·学习·spring·minispring